有关异或的一些习题整理
第一个:
给出一个序列
求子集的算术和的异或和
爆搜是不行的,但是STL库很好
bitset
#include <cstdio> #include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; using namespace std; #define MAXN 2000001 bitset <MAXN> a; int n,x,h,ans; int main() { cin>>n; a[0]=1; for (int i=1;i<=n;i++) { cin>>x; a^=(a<<x); h+=x; } for (int i=h;i;i--) { if (a[i]) { ans^=i; } } cout<<ans<<endl; return 0; }
然后呢?
下面一个:
奶牛异或:
在一个序列中,找一段连续子序列异或和最大:
#include <cstdio> #include <iostream> #include <string> #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; const int MAXN = 50005; const int maxnode = MAXN * 33; const int sigma_size = 2; const int INF = (1LL << 31) - 1; struct Trie { int ch[maxnode][sigma_size]; int val[maxnode]; int sz; void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } Trie() { clear(); } int idx(char c) { return c - '0'; } void insert(char *s, int v) { int u = 0, n = strlen(s); for(int i = 0; i < n; i++) { int c = idx(s[i]); if(!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); val[u] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u] = v; } //^0 equal //^1 opposite int find(char *s, int value, int dir) { int u = 0, n = strlen(s); for(int i = 0; i < n; i++) { int c = idx(s[i]); int v = c ^ dir; if(!ch[u][v]) v ^= 1; u = ch[u][v]; } return val[u] ^ value; } } trie; int n, sum[MAXN], A[MAXN]; char bit[33]; void trans(char *s, int v) { for(int i = 31; i >= 0; i--) s[i] = ((v >> i) & 1) + '0'; s[32] = '