#include<bits/stdc++.h> #define ll long long using namespace std; const int N=605; const int mod=1e9+7; void add(int &x,int y) { x+=y; if (x>=mod) { x-=mod; } } int n,m,a[N],dp[N][N],h[N],f[N][N][2],g[N][N][2],e[N][2]; void DP(int i,bool flag) { for (int k=0;k<=m;k++) { if (!dp[i][k]) { continue; } for (int j=0;j<=1;j++) { int to=e[i][j]; if (0<=to&&to<m) { if (a[to]==flag&&!k) { continue; } add(dp[to][k+(a[to]==flag?-1:1)],dp[i][k]); } } } } signed main() { ios::sync_with_stdio(false),cin.tie(0); cout.precision(10),cout.setf(ios::fixed); cin>>n; for (int p=1;p<=n;p++) { string s; cin>>s; m=s.size(); for (int i=0;i<m;i++) { a[i]=s[i]=='P'; } int nxt[2]={m,m}; for (int i=m-1;i>=0;i--) { e[i][0]=nxt[0],e[i][1]=nxt[1]; nxt[a[i]]=i; } memset(dp,0,sizeof(dp)); bool flag=1; for (int i=0;i<m;i++) { if (flag&&a[i]==0) { dp[i][1]++; flag=0; } DP(i,1); add(h[p],dp[i][0]); for (int k=0;k<=m;k++) { if (!dp[i][k]) { continue; } for (int j=0;j<=1;j++) { if (e[i][j]==m) { add(f[p][k][j],dp[i][k]); } } } } for (int i=0;i<=1;i++) { if (nxt[i]==m) { f[p][0][i]++; } } nxt[0]=nxt[1]=-1; for (int i=0;i<m;i++) { e[i][0]=nxt[0],e[i][1]=nxt[1]; nxt[a[i]]=i; } memset(dp,0,sizeof(dp)); flag=1; for (int i=m-1;i>=0;i--) { if (flag&&a[i]==1) { dp[i][1]++; flag=0; } DP(i,0); for (int k=0;k<=m;k++) { add(g[p][k][a[i]],dp[i][k]); } } } for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) { int ans=h[i]; for (int k=0;k<=600;k++) { ans=(ans+1LL*f[i][k][0]*g[j][k][0])%mod; ans=(ans+1LL*f[i][k][1]*g[j][k][1])%mod; } cout<<ans<<" \n"[j==n]; } } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include<bits/stdc++.h> #define ll long long using namespace std; const int N=605; const int mod=1e9+7; void add(int &x,int y) { x+=y; if (x>=mod) { x-=mod; } } int n,m,a[N],dp[N][N],h[N],f[N][N][2],g[N][N][2],e[N][2]; void DP(int i,bool flag) { for (int k=0;k<=m;k++) { if (!dp[i][k]) { continue; } for (int j=0;j<=1;j++) { int to=e[i][j]; if (0<=to&&to<m) { if (a[to]==flag&&!k) { continue; } add(dp[to][k+(a[to]==flag?-1:1)],dp[i][k]); } } } } signed main() { ios::sync_with_stdio(false),cin.tie(0); cout.precision(10),cout.setf(ios::fixed); cin>>n; for (int p=1;p<=n;p++) { string s; cin>>s; m=s.size(); for (int i=0;i<m;i++) { a[i]=s[i]=='P'; } int nxt[2]={m,m}; for (int i=m-1;i>=0;i--) { e[i][0]=nxt[0],e[i][1]=nxt[1]; nxt[a[i]]=i; } memset(dp,0,sizeof(dp)); bool flag=1; for (int i=0;i<m;i++) { if (flag&&a[i]==0) { dp[i][1]++; flag=0; } DP(i,1); add(h[p],dp[i][0]); for (int k=0;k<=m;k++) { if (!dp[i][k]) { continue; } for (int j=0;j<=1;j++) { if (e[i][j]==m) { add(f[p][k][j],dp[i][k]); } } } } for (int i=0;i<=1;i++) { if (nxt[i]==m) { f[p][0][i]++; } } nxt[0]=nxt[1]=-1; for (int i=0;i<m;i++) { e[i][0]=nxt[0],e[i][1]=nxt[1]; nxt[a[i]]=i; } memset(dp,0,sizeof(dp)); flag=1; for (int i=m-1;i>=0;i--) { if (flag&&a[i]==1) { dp[i][1]++; flag=0; } DP(i,0); for (int k=0;k<=m;k++) { add(g[p][k][a[i]],dp[i][k]); } } } for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) { int ans=h[i]; for (int k=0;k<=600;k++) { ans=(ans+1LL*f[i][k][0]*g[j][k][0])%mod; ans=(ans+1LL*f[i][k][1]*g[j][k][1])%mod; } cout<<ans<<" \n"[j==n]; } } return 0; } |