小记:艹蛋呢, 取long long的低30,32,34位都WA, 取31位才AC。
。。
思路:依据求数组中两个数异或最大值。參考
代码:
#include <stdio.h> #include <string.h> #define MAX(a,b) ((a)>(b)?(a):(b)) #define NODE 3200010 #define N 100010 int n; int v[N]; int node; int next[NODE][2]; int end[NODE]; void add(int cur,int k) { memset(next[node],0,sizeof(next[node])); end[node]=0; next[cur][k]=node++; } int cal(int x) { int i,k,cur=0; for(i=30; i>=0; i--) { k=((1<<i)&x)?0:1; if(next[cur][k]) cur=next[cur][k]; else cur=next[cur][1-k]; } return end[cur]; } int main() { int n, i, ans, T, m, t,x, cur, j, k; scanf("%d", &T); for(int Ca = 1; Ca <= T; ++Ca) { scanf("%d%d", &n, &m); node=1; memset(next[0],0,sizeof(next[0])); for(i=0; i<n; i++) { scanf("%d",&x); v[i]=x; cur=0; for(j=30; j>=0; j--) { k=((1<<j)&x)?1:0; if(next[cur][k]==0) add(cur,k); cur=next[cur][k]; } end[cur]=x; } printf("Case #%d: ",Ca); for (i = 0; i < m; ++i) { scanf("%d", &t); ans = cal(t); printf("%d ", ans); } } return 0; }