hdu 4901 The Romantic Hero

http://acm.hdu.edu.cn/showproblem.php?pid=4901

dp1[i][j]是i参与,异或值为j的个数,x1[i][j]是以i位置向前到1的位置的异或值为j的个数,dp2[i][j]是i参与,&值为j的个数,x2[i][j]是以i位置向前到n的位置的&值为j的个数。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define ll __int64
 5 using namespace std;
 6 const int mod=1000000007;
 7 
 8 ll dp1[1100][1100];
 9 ll dp2[1100][1100];
10 ll x1[1100][1100];
11 ll x2[1100][1100];
12 int t,n;
13 int c[1100];
14 
15 int main()
16 {
17     scanf("%d",&t);
18     while(t--)
19     {
20         scanf("%d",&n);
21         for(int i=1; i<=n; i++)
22         {
23             scanf("%d",&c[i]);
24         }
25         memset(dp1,0,sizeof(dp1));
26         memset(dp2,0,sizeof(dp2));
27         memset(x1,0,sizeof(x1));
28         memset(x2,0,sizeof(x2));
29         for(int i=1; i<=n; i++)
30         {
31             for(int j=0; j<=1024; j++)
32             {
33                 int m=j^c[i];
34                 dp1[i][m]=(dp1[i][m]+x1[i-1][j])%mod;
35             }
36             dp1[i][c[i]]=(dp1[i][c[i]]+1)%mod;
37             for(int j=0; j<=1024; j++)
38             {
39                 x1[i][j]=(x1[i-1][j]+dp1[i][j])%mod;
40             }
41         }
42         for(int i=n; i>=1; i--)
43         {
44             for(int j=0; j<=1024; j++)
45             {
46                 int m=j&c[i];
47                 dp2[i][m]=(dp2[i][m]+x2[i+1][j])%mod;
48             }
49             dp2[i][c[i]]=(dp2[i][c[i]]+1)%mod;
50             for(int j=0; j<=1024; j++)
51             {
52                 x2[i][j]=(x2[i+1][j]+dp2[i][j])%mod;
53             }
54         }
55         ll ans=0,sum;
56         for(int i=1; i<=n-1; i++)
57         {
58             for(int j=0; j<=1024; j++)
59             {
60                 sum=(dp1[i][j]*x2[i+1][j])%mod;
61                 ans=(ans+sum)%mod;
62             }
63         }
64         printf("%I64d
",ans);
65     }
66     return 0;
67 }
View Code
原文地址:https://www.cnblogs.com/fanminghui/p/3883549.html