标签:
Time Limit: 3000MS | Memory Limit: 131072KB | 64bit IO Format: %I64d & %I64u |
Description
开头背景介绍无用
Input
Output
Sample Input
Sample Output
Source
动规。先预处理好XOR集合和AND集合在每个位置的最优解,之后枚举断点,左边是XOR集合,右边是AND集合,累加答案。
1 #include<algorithm> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 const int q=1000000007; 7 const int mxn=1200; 8 int n,k; 9 int a[mxn]; 10 int f[mxn][mxn],t[mxn][mxn]; 11 int main(){ 12 int T; 13 scanf("%d",&T); 14 while(T--){ 15 memset(f,0,sizeof(f)); 16 memset(t,0,sizeof(t)); 17 scanf("%d",&n); 18 int i,j; 19 for(i=1;i<=n;i++)scanf("%d",&a[i]); 20 //xor 21 f[0][0]=1; //边界 22 for(i=1;i<=n;i++){ 23 for(j=0;j<1024;j++){ 24 f[i][j]=(f[i-1][j]+f[i-1][j^a[i]])%q; 25 } 26 } 27 //and 28 for(i=1;i<=n;i++)t[i][a[i]]=1; 29 for(i=n;i>=1;i--){ 30 for(j=0;j<1024;j++){ 31 t[i][j]=t[i+1][j];//不选 32 } 33 for(j=0;j<1024;j++){//选 34 t[i][j&a[i]]=(t[i][j&a[i]]+t[i+1][j])%q; 35 } 36 t[i][a[i]]=(t[i][a[i]]+1)%q; 37 } 38 // 39 int ans=0; 40 for(i=1;i<n;i++){ 41 for(j=0;j<1024;j++) 42 ans=(ans+(long long)t[i+1][j]*f[i-1][j^a[i]])%q;//累加结果 43 } 44 printf("%d\n",ans); 45 } 46 return 0; 47 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5634285.html