HDU 5269 字典树

ZYB喜欢研究Xor,现在他得到了一个长度为n的数组A。于是他想知道:对于所有数对(i,j)(i[1,n],j[1,n])lowbit(AixorAj)之和为多少.由于答案可能过大,你需要输出答案对998244353取模后的值
定义lowbit(x)=2k,其中k是最小的满足(x and 2k)>0的数
特别地:lowbit(0)=0
输入描述
一共T(T10)组数据,对于每组数据:
第一行一个正整数n,表示数组长度
第二行n个非负整数,第i个整数为Ai
n[1,5104]Ai[0,229]
输出描述
每组数据输出一行Case #x: ans。x表示组数编号,从1开始。ans为所求值。
解题思路:
 
  
 建立字典树,每输入一个数对其做一次计算,加上之前的和他不同的个数,因为是无序的,最后乘以2.

#include
#include
#include
#include
#include
#define mod 998244353
using namespace std;
int ans; const int maxt=30*51000;
int bit[35];
int tree[maxt][2];
int num[maxt];

struct trie
{

    int tot;
    void init()
    {
        tot=1;
        memset(tree,0,sizeof(tree));
        memset(num,0,sizeof(num));
    }

    int  newnode()
    {
        num[++tot]=0;
        tree[tot][0]=tree[tot][1]=0;
        return tot;
    }

    void insert(int val)
    {
        int p=1;int temp;
        for(int i=0;i<=29;i++)
        {
            ++num[p];
            if((val>>i)&1) temp=1;else temp=0;
//            cout<

你可能感兴趣的:(数据结构)