POJ 4901 The Romantic Hero DP

来源:互联网 发布:数据库limit的用法 编辑:程序博客网 时间:2024/06/05 17:12
//890MS12388K#include <cstdio>#include <iostream>#include <cstring>using namespace std;typedef long long ll;const int maxa = 1024;const int maxn = 1000;const int mod = int(1e9) + 7;int f[maxn+5][maxa], g[maxn+5][maxa], h[maxn+5][maxa];inline void add_it(int& a, int b){    a = (a + b) % mod;}int main() {    int a[maxn],T,n;    short i,j,t;    int ans;    scanf("%d",&T);    while(T--) {        scanf("%d",&n);        for(i=1; i<=n; i++)            scanf("%d",&a[i]);        memset(f, 0, sizeof(f));        memset(g, 0, sizeof(g));        memset(h, 0, sizeof(h));        f[1][a[1]]=1;        for(i=2; i<=n-1; i++) {            f[i][a[i]]++;///单独一个元素的集合的情况            for(j=0; j<maxa; j++) {                if(f[i-1][j]) {                    add_it(f[i][j], f[i-1][j]);                    t=j^a[i];                    add_it(f[i][t], f[i-1][j]);                }            }        }        g[n][a[n]]=1;        h[n][a[n]]=1;        for(i=n-1; i>=2; i--) {            g[i][a[i]]++;            h[i][a[i]]++;            for(j=0; j<maxa; j++) {                if(h[i+1][j]) {                    add_it(h[i][j], h[i+1][j]);                    t=j&a[i];                    add_it(h[i][t], h[i+1][j]);                    add_it(g[i][t], h[i+1][j]);                }            }        }        ans=0;        for(i=1; i<=n-1; i++)            for(j=0; j<maxa; j++) {                if(f[i][j]&&g[i+1][j]) {                    add_it(ans, ((ll)f[i][j] * g[i+1][j]) % mod);                }            }        printf("%d\n",ans);    }    return 0;}

//WA#include <cstdio>#include <iostream>#include <cstring>using namespace std;typedef long long ll;const int max_n = 1000 + 5;const int max_a = 1024 + 5;const int mod = int(1e9) + 7;int a[max_n];int dp1[max_n][max_a], dp2[max_n][max_a], dp3[max_n][max_a];int n;inline void add_it(int& a, int b){    a = (a + b) % mod;}/*void DP1(){    memset(dp1, 0, sizeof(dp1));    //dp1[1][0] = 1;    //dp1[1][a[1]] = 1;    //dp1[0][0] = 1;    //dp1[0][0] = 1;    //dp1[1][a[1]] = 1;    for(int i=1; i<=n-1; i++){        dp1[i][a[i]]++;        for(int j=0; j<=1023; j++){            if(dp1[i][j]){                dp1[i+1][j] = (dp1[i+1][j] + dp1[i][j]) % mod;                int jj = j^a[i+1];                dp1[i+1][jj] = (dp1[i+1][jj] + dp1[i][j]) % mod;            }        }    };    //for(int i=1; i<=n; i++) dp1[i][0]--;}*/void DP1(){    memset(dp1, 0, sizeof(dp1));    dp1[1][a[1]] = 1;    for(int i=2; i<=n-1; i++){        dp1[i][a[i]]++;        for(int j=0; j<1024; j++){            if(dp1[i-1][j]){                add_it(dp1[i][j], dp1[i-1][j]);                int t = j^a[i];                add_it(dp1[i][t], dp1[i-1][j]);            }        }    }}/*void DP2(){    memset(dp2, 0, sizeof(dp2));    memset(dp3, 0, sizeof(dp3));    //dp2[n][0] = 1;    //dp3[n][a[n]] = 1;    for(int i=n; i>=2; i--){        dp3[i][a[i]]++;        for(int j=0; j<=1023; j++){            if(dp2[i][j]){                dp3[i-1][j&a[i-1]] = (dp3[i-1][j&a[i-1]] + dp2[i][j]) % mod;                dp2[i-1][j] = (dp2[i-1][j] + dp2[i][j]) % mod;            }            if(dp3[i][j]){               dp3[i-1][j&a[i-1]] = (dp3[i-1][j&a[i-1]] + dp3[i][j]) % mod;               dp2[i-1][j] = (dp2[i-1][j] + dp3[i][j]) % mod;            }        }    }    dp3[1][a[1]]++;}*/void DP2(){    memset(dp2, 0, sizeof(dp2));    memset(dp3, 0, sizeof(dp3));    dp2[n][a[n]] = 1;    dp3[n][a[n]] = 1;    for(int i=n-1; i>=2; i--){        dp2[i][a[i]]++;        dp3[i][a[i]]++;        for(int j=0; j<1024; j++){            if(dp2[i+1][j]){                add_it(dp2[i][j], dp2[i+1][j]);                int t = j & a[i];                add_it(dp2[i][t], dp2[i+1][j]);                add_it(dp3[i][t], dp2[i+1][j]);            }        }    }}int main(){    int T; scanf("%d", &T);    while(T--){        scanf("%d", &n);        for(int i=1; i<=n; i++)            scanf("%d", &a[i]);        //for(int i=1; i<=n; i++) b[i] = a[n+1-i];        DP1();        DP2();        int res = 0;        for(int i=1; i<=n-1; i++){        for(int j=0; j<=1023; j++){                                if(dp1[i][j] && dp3[i+1][j])                res = (res + (ll)(dp1[i][j] * dp3[i+1][j]) % mod) % mod;            }        }        printf("%d\n", res);    }    return 0;}

0 0