您的位置:首页 > 产品设计 > UI/UE

Hackerrank XOR Subsequences

2016-12-15 18:19 330 查看
求连续子串的Xor和出现次数最多的Xor和

Xoryi=xAi=(Xorx−1i=1Ai)Xor(Xoryi=1Ai)

最后发现其实就是个卷积形式

上FWT即可

中间处理过程可能会爆int 所以加上取模会免掉不必要的麻烦

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;

char c;
inline void read(int&a)
{a=0;do c=getchar();while(c<'0'||c>'9');while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();}
int A[100001],B[100001];
const
int Mod=(int)1e9+7,Rev=(Mod+1)/2;
int W[1<<16];

inline int add(int a,int b)
{
a+=b;
if(a>=Mod)a-=Mod;
if(a<0)a+=Mod;
return a;
}

inline int mul(int a,int b)
{
return a*1ll*b%Mod;
}

int main()
{
int n;
read(n);
A[0]++;
for(int i=1;i<=n;i++)read(W[i]),W[i]^=W[i-1],A[W[i]]++;
for(int i=1;i<(1<<16);i*=2)
for(int j=0;j<(1<<16);j+=2*i)
for(int k=0;k<i;k++)
{
int x=A[j+k],y=A[i+j+k];
A[j+k]=add(x,y);
A[i+j+k]=add(x,-y);
}
for(int i=0;i<(1<<16);i++)
A[i]=mul(A[i],A[i]);
for(int i=1;i<(1<<16);i*=2)
for(int j=0;j<(1<<16);j+=2*i)
for(int k=0;k<i;k++)
{
int x=A[j+k],y=A[i+j+k];
A[j+k]=mul(Rev,add(x,y));
A[j+k+i]=mul(Rev,add(x,-y));
}
A[0]-=n+1;
int L=0;
for(int i=1;i<=n;i++)
if(A[i]>A[L])L=i;
printf("%d %d\n",L,A[L]>>1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: