#include <bits/stdc++.h> using namespace std; const int MX=607,md=1000000007; int n,i,j,k,bal,msk,res,len[MX],f[MX][MX][4][2],b[MX][MX][4][2]; char s[MX][MX]; long long cur; void upd(int& x, int v) { if ((x+=v)>=md) x-=md; } int main() { scanf("%d",&n); for (i=0; i<n; i++) { scanf("%s",s[i]); len[i]=strlen(s[i]); for (j=0; j<len[i]; j++) s[i][j]=int(s[i][j]=='L'); } for (i=0; i<n; i++) { //bool was=false; f[i][0][3][1]=1; for (k=0; k<len[i]; k++) if (s[i][k]) { for (bal=k; bal>=0; --bal) for (msk=2; msk<4; ++msk) for (j=0; j<2; j++) if (f[i][bal][msk][j]) { upd(f[i][bal+1][3][1],f[i][bal][msk][j]); upd(f[i][bal][msk^2][j],f[i][bal][msk][j]); f[i][bal][msk][j]=0; } //if (!was) { f[i][1][3][1]=1; was=true; } } else { for (bal=1; bal<=k; ++bal) for (msk=1; msk<4; msk+=2) for (j=0; j<2; j++) if (f[i][bal][msk][j]) { upd(f[i][bal-1][3][0],f[i][bal][msk][j]); upd(f[i][bal][msk^1][j],f[i][bal][msk][j]); f[i][bal][msk][j]=0; } } //was=false; b[i][0][3][1]=1; for (k=0; k<len[i]; k++) if (s[i][len[i]-k-1]==0) { for (bal=k; bal>=0; --bal) for (msk=2; msk<4; ++msk) for (j=0; j<2; j++) if (b[i][bal][msk][j]) { upd(b[i][bal+1][3][1],b[i][bal][msk][j]); upd(b[i][bal][msk^2][j],b[i][bal][msk][j]); b[i][bal][msk][j]=0; } //if (!was) { b[i][1][3][1]=1; was=true; } } else { for (bal=1; bal<=k; ++bal) for (msk=1; msk<4; msk+=2) for (j=0; j<2; j++) if (b[i][bal][msk][j]) { upd(b[i][bal-1][3][0],b[i][bal][msk][j]); upd(b[i][bal][msk^1][j],b[i][bal][msk][j]); b[i][bal][msk][j]=0; } } } //for (i=0; i<n; i++) for (res=bal=0; bal<=len[i]; bal++) for (msk=0; msk<4; msk++) for (j=0; j<2; j++) printf("%d %d %d %d = %d %d\n",i,bal,msk,j,f[i][bal][msk][j],b[i][bal][msk][j]); for (i=0; i<n; i++, puts("")) for (int ii=0; ii<n; ii++) { for (res=md-1, bal=0; bal<=len[i]; bal++) for (msk=0; msk<4; msk++) for (j=0; j<2; j++) if (cur=f[i][bal][msk][j]) for (int ms=0; ms<4; ms++) for (int js=0; js<2; js++) if (b[ii][bal][ms][js] && ((msk>>(js^1))&1)){/* && (ms>>(j^1))&1) {*/ //printf("%d %d [@%d] += %d %d (%d) x %d %d (%d)\n",i,ii,bal,msk,j,f[i][bal][msk][j],ms,js,b[ii][bal][ms][js]); upd(res,(cur*b[ii][bal][ms][js])%md); //printf("=%d\n",res); } printf("%d ",res); } 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 | #include <bits/stdc++.h> using namespace std; const int MX=607,md=1000000007; int n,i,j,k,bal,msk,res,len[MX],f[MX][MX][4][2],b[MX][MX][4][2]; char s[MX][MX]; long long cur; void upd(int& x, int v) { if ((x+=v)>=md) x-=md; } int main() { scanf("%d",&n); for (i=0; i<n; i++) { scanf("%s",s[i]); len[i]=strlen(s[i]); for (j=0; j<len[i]; j++) s[i][j]=int(s[i][j]=='L'); } for (i=0; i<n; i++) { //bool was=false; f[i][0][3][1]=1; for (k=0; k<len[i]; k++) if (s[i][k]) { for (bal=k; bal>=0; --bal) for (msk=2; msk<4; ++msk) for (j=0; j<2; j++) if (f[i][bal][msk][j]) { upd(f[i][bal+1][3][1],f[i][bal][msk][j]); upd(f[i][bal][msk^2][j],f[i][bal][msk][j]); f[i][bal][msk][j]=0; } //if (!was) { f[i][1][3][1]=1; was=true; } } else { for (bal=1; bal<=k; ++bal) for (msk=1; msk<4; msk+=2) for (j=0; j<2; j++) if (f[i][bal][msk][j]) { upd(f[i][bal-1][3][0],f[i][bal][msk][j]); upd(f[i][bal][msk^1][j],f[i][bal][msk][j]); f[i][bal][msk][j]=0; } } //was=false; b[i][0][3][1]=1; for (k=0; k<len[i]; k++) if (s[i][len[i]-k-1]==0) { for (bal=k; bal>=0; --bal) for (msk=2; msk<4; ++msk) for (j=0; j<2; j++) if (b[i][bal][msk][j]) { upd(b[i][bal+1][3][1],b[i][bal][msk][j]); upd(b[i][bal][msk^2][j],b[i][bal][msk][j]); b[i][bal][msk][j]=0; } //if (!was) { b[i][1][3][1]=1; was=true; } } else { for (bal=1; bal<=k; ++bal) for (msk=1; msk<4; msk+=2) for (j=0; j<2; j++) if (b[i][bal][msk][j]) { upd(b[i][bal-1][3][0],b[i][bal][msk][j]); upd(b[i][bal][msk^1][j],b[i][bal][msk][j]); b[i][bal][msk][j]=0; } } } //for (i=0; i<n; i++) for (res=bal=0; bal<=len[i]; bal++) for (msk=0; msk<4; msk++) for (j=0; j<2; j++) printf("%d %d %d %d = %d %d\n",i,bal,msk,j,f[i][bal][msk][j],b[i][bal][msk][j]); for (i=0; i<n; i++, puts("")) for (int ii=0; ii<n; ii++) { for (res=md-1, bal=0; bal<=len[i]; bal++) for (msk=0; msk<4; msk++) for (j=0; j<2; j++) if (cur=f[i][bal][msk][j]) for (int ms=0; ms<4; ms++) for (int js=0; js<2; js++) if (b[ii][bal][ms][js] && ((msk>>(js^1))&1)){/* && (ms>>(j^1))&1) {*/ //printf("%d %d [@%d] += %d %d (%d) x %d %d (%d)\n",i,ii,bal,msk,j,f[i][bal][msk][j],ms,js,b[ii][bal][ms][js]); upd(res,(cur*b[ii][bal][ms][js])%md); //printf("=%d\n",res); } printf("%d ",res); } return 0; } |