HDU--4825 Xor Sum (字典树)

时间:2021-06-17 13:48:55

题目链接: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));
      }
   }
}