3 条题解

  • 2
    @ 2021-10-5 9:04:13
    //考虑两个相同的数异或为0
    //所以dis(x,y)=dis(1,x)^dis(1,y)
    //直接01trie维护就好了
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+5;
    vector<int> e[N],g[N];
    int n,k,tr[N*30][2],s[N*30],tot=1;
    long long sum;
    void add(int x){
       int now=1;
       for(int i=30;i>=0;i--){
          s[now]++;
          int p=(x>>i)&1;
          if(!tr[now][p])tr[now][p]=++tot;
          now=tr[now][p];
       }
       s[now]++;
    }
    int ask(int x){
       int now=1,ans=0;
       for(int i=30;i>=0;i--){
          int p=(x>>i)&1;
          int q=(k>>i)&1;
          if(q==0) ans+=s[tr[now][p^1]],now=tr[now][p];
          else now=tr[now][p^1];
       }
       return ans+s[now];
    }
    void dfs(int x,int fa,int s){
       sum+=ask(s);
       add(s);
       for(int i=0;i<e[x].size();i++){
          int y=e[x][i],z=g[x][i]; 
          if(y==fa)continue;
          dfs(y,x,s^z);
       }
    }
    int main(){
       scanf("%d%d",&n,&k);
       for(int i=1;i<n;i++){
          int x,y,z;
          scanf("%d%d%d",&x,&y,&z);
          e[x].push_back(y),g[x].push_back(z);
          e[y].push_back(x),g[y].push_back(z);
       }
       dfs(1,0,0);
       printf("%lld",sum);
       return 0;
    }
    

    信息

    ID
    93
    时间
    2500ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    1853
    已通过
    122
    上传者