• Educational Codeforces Round 12 E. Beautiful Subarrays trie求两异或值大于等于k对数


    E. Beautiful Subarrays
     

    One day, ZS the Coder wrote down an array of integers a with elements a1,  a2,  ...,  an.

    A subarray of the array a is a sequence al,  al  +  1,  ...,  ar for some integers (l,  r) such that 1  ≤  l  ≤  r  ≤  n. ZS the Coder thinks that a subarray of a is beautiful if the bitwise xor of all the elements in the subarray is at least k.

    Help ZS the Coder find the number of beautiful subarrays of a!

    Input

    The first line contains two integers n and k (1 ≤ n ≤ 106, 1 ≤ k ≤ 109) — the number of elements in the array a and the value of the parameter k.

    The second line contains n integers ai (0 ≤ ai ≤ 109) — the elements of the array a.

    Output

    Print the only integer c — the number of beautiful subarrays of the array a.

    Examples
    input
    3 1
    1 2 3
    output
    5
     
    题意:
      
      给你n个数的序列,问你多少区间的异或值大于等于k
     
    题解:
      
      对于每一个前缀我们插入trie中,
      询问当前前缀与之前前缀的异或值大于等于k就好
     
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 2e7+6;
    struct Tri
    {
        int ch[maxn][2];
        int sz[maxn];
        int tot;
        void init()
        {
            memset(ch,0,sizeof(ch));
            memset(sz,0,sizeof(sz));
            tot=2;
        }
        void insert(int x)
        {
            int u=1;sz[u]++;
            for(int i=30;i>=0;i--)
            {
                int p = (x>>i)&1;
                if(!ch[u][p])ch[u][p]=tot++;
                u=ch[u][p]; sz[u]++;
            }
        }
        int get(int x,int y)
        {
            int u=1;
            long long ans = 0;
            for(int i=30;i>=0;i--)
            {
                int p = (x>>i)&1^1;
                int q = (y>>i)&1;
                if(q==0)ans+=sz[ch[u][p]],u=ch[u][p^1];
                else u=ch[u][p];
                if(u==1) return ans;
            }
            return ans+sz[u];
        }
    }T;
    int main()
    {
        T.init();
        int n,k;
        scanf("%d%d",&n,&k);
        int pre = 0;
        long long ans = 0;
        T.insert(0);
        for(int i=1;i<=n;i++)
        {
            int x;scanf("%d",&x);
            pre^=x;
            ans+=T.get(pre,k);
            T.insert(pre);
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    最全负载均衡:算法、实现、亿级负载解决方案详解
    淘宝分布式架构演变案例详解
    分布式一致性协议实现原理
    ReentrantReadWriteLock的使用
    线程之单例
    线程的优先级
    java线程的6种状态
    mybatis <foreach> 标签
    java多线程 上下文切换
    docker的复制和挂载
  • 原文地址:https://www.cnblogs.com/zxhl/p/5421239.html
Copyright © 2020-2023  润新知