题目链接:HDU--4825 Xor Sum
mmp sb字典树因为数组开的不够大一直wa 不是报的 re!!! 找了一下午bug 草
把每个数转化成二进制存字典树里面 然后尽量取与x这个位置上不相同的
先来一个最原始的代码写的跟屎一样的
#include<iostream> #include<cstring> #include<algorithm> #include<string.h> #include<stdio.h> #include<cmath> #include<vector> using namespace std; #define maxn 100010 ; struct ac{ ]; void init(){ sum=;fa=; memset(nex,,sizeof(nex)); } }tre[maxn*]; void add(char a[],long long ii){ // 在这里转化成字符串了 ,j=,k=; while(a[i]){ '; if(tre[k].nex[z]){ j=tre[k].nex[z]; tre[j].sum++; }else{ tre[k].nex[z]=++tot; j=tot; tre[j].init(); tre[j].sum++; } k=j; i++; } tre[k].fa=ii; } long long query(char a[]){ ,j=,k=; ; while(a[i]){ '; ){ ]){ j=tre[k].nex[]; }]; }else{ ]){ j=tre[k].nex[]; }]; } k=j; i++; } return tre[k].fa; } ; void init(){ tot=;cnt=; memset(tre,,sizeof(tre)); } ],b[]; int main(){ ; scanf("%lld",&t); while(t--){ init(); long long n,m; scanf("%lld%lld",&n,&m); ;j<n;j++){ long long x; scanf("%lld",&x); c[cnt++]=x; ; while(x){ ; a[len++]=i+'; x/=; } ; ;k<=;k++){ -k)==z){ b[k]=a[z]; z--; }'; } add(b,c[cnt-]); } printf("Case #%lld:\n",ant++); ;j<m;j++){ long long x; scanf("%lld",&x); long long ii=x; ; while(x){ ; a[len++]=i+'; x/=; } ; ;k<=;k++){ -k)==z){ b[k]=a[z]; z--; }'; } long long i=query(b); printf("%lld\n",i); } } }
改善过后舒心多了
#include<bits/stdc++.h> using namespace std; #define maxn 3000000+5 int a[maxn]; int tot; struct ac{ ]; void init(){ fa=-;memset(nex,-,sizeof(nex)); } }tre[maxn]; void add(int x,int y){ ; ;j>=;j--){ <<j)&x); ){ tre[k].nex[z]=++tot; tre[tot].init(); } k=tre[k].nex[z]; } //cout<<k<<" "<<y<<endl; tre[k].fa=y; } int query(int x){ ; ;j>=;j--){ <<j)&x); ]!=-){ k=tre[k].nex[z^]; } else k=tre[k].nex[z]; } return tre[k].fa; } void init(){ memset(tre,,sizeof(tre)); tot=; tre[].init(); } int main(){ ; cin>>t; while(t--){ init(); int n,m; scanf("%d%d",&n,&m); ;j<n;j++){ int x; scanf("%d",&x); add(x,x); } printf("Case #%d:\n",ant++); ;j<m;j++){ int x; scanf("%d",&x); printf("%d\n",query(x)); } } }