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\n",ans);

65     }

66     return 0;

67 }
View Code

 

你可能感兴趣的:(ant)