zoj 3870 异或运算

来源:互联网 发布:淘宝dw全屏代码怎么用 编辑:程序博客网 时间:2024/05/21 09:19
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 1e5+5;int n,a[N],num[N];void Cal(int t){    int l = 31;    while(l >= 0)    {        if(t & (1<<l))//找到第一个1的那一位        {            num[l]++;            return;        }        l--;    }}int main(){    int t;    cin>>t;    while(t--)    {        memset(num,0,sizeof(num));        scanf("%d",&n);        for(int i = 1;i <= n;i++)        {            scanf("%d",&a[i]);            Cal(a[i]);        }        //printf("+++**\n");        int sum = 0;        for(int i = 1;i <= n;i++)        {            int l = 31;            while(l >= 0)                if(!(a[i] & (1<<l)))//跳过首个1之前的0                    l--;                else                    break;            while(l >= 0)            {                if(!(a[i] & (1<<l)))//首个1出现之后出现的0                    sum += num[l];                l--;            }            //printf("+++\n");        }        cout<<sum<<endl;    }    return 0;}
0 0
原创粉丝点击