qbxt Day 4 乱搞+乱搞+乱搞

来源:互联网 发布:abplc编程软件安装 编辑:程序博客网 时间:2024/06/06 15:51

吐槽:

我语文不好!
T1,T3的题面看不懂 读了40分钟还是不懂
至于难度,两个字:呵呵~;

T2:

这里写图片描述

lowbit(a ^ b) =>

a,b在二进制中,从左向右,a和b第一个不同的数;

可以用Trie树来做,记录每个节点
1的儿子数和0的儿子数;
最后dfs遍历整棵树统计答案;

注意:
不要忘记取模;

取模要彻底(对所有的乘都要取模)!!!

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define lc(x) ch[x][0]#define rc(x) ch[x][1]using namespace std;const int mod = 998244353,MAXN = 600001;int a[MAXN],ch[MAXN*8][2],cnt,siz[MAXN*8][2];int sum,n,T,tot;int read(){    char c = getchar();    int ss = 0,flag=1;    while(c < '0' || c > '9')     {        if(c == '-') flag = -1;        c = getchar();    }    while(c >= '0' && c <= '9')    {        ss = ss * 10 + c - '0';        c = getchar();    }    return ss * flag;}struct Trie{    void insert(int x)    {        int rt = 0;        for(int i = 0;i <= 31;i ++ )        {            int p = (x >> i) & 1;            if(!ch[rt][p]) ch[rt][p] = ++cnt;            siz[rt][p]++;            rt = ch[rt][p];        }        return;    }    void dfs(int rt,int k)    {        if(k>31) return;        if(siz[rt][0] && siz[rt][1])         sum = (sum % mod + (1 << (k + 1)) % mod * siz[rt][0] % mod * siz[rt][1] % mod) % mod;        if(lc(rt)) dfs(lc(rt),k + 1);        if(rc(rt)) dfs(rc(rt),k + 1);        return;    }}trie;void init(){    memset(ch,0,sizeof(ch));    memset(siz,0,sizeof(siz));    sum = 0;    cnt = 0;    return;}void solve(){    T=read();    while(T--)    {        init();        n=read();        for(int i = 1;i <= n;i ++)  a[i]=read(),trie.insert(a[i]);        trie.dfs(0,0);        printf("Case #%d: %d\n",++tot,sum%mod);    }    return;}int main(){    solve();    return 0;}
原创粉丝点击