#include<bits/stdc++.h> #define mod 1000000007 using namespace std; inline int read() { int n=0,f=1,ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { n=n*10+ch-'0'; ch=getchar(); } return n*f; } char s[605][605]; int dp[605][605][4]; int dp2[605][605][4][2]; int lans[605][605][4],rans[605][605][2]; int main() { int n; n=read(); for(int i=1;i<=n;i++) { scanf("%s",s[i]+1); } for(int i=1;i<=n;i++) { dp[0][0][0]=1; int len=strlen(s[i]+1); for(int j=1;j<=len;j++)for(int k=0;k<=len;k++)for(int l=0;l<=3;l++)dp[j][k][l]=0; for(int j=1;j<=len;j++) { for(int k=0;k<=j-1;k++) { for(int l=0;l<=3;l++) { int sth=l; if(s[i][j]=='L')sth|=1; else sth|=2; dp[j][k][sth]=(dp[j][k][sth]+dp[j-1][k][l])%mod; //printf("%d %d %d %d\n",j,k,sth,dp[j][k][sth]); } } for(int k=0;k<=j-1;k++) { int now=k; if(s[i][j]=='L')now++; else now--; if(now<0)continue; for(int l=0;l<=3;l++) { if(s[i][j]=='L'&&(l&1)!=0)continue; if(s[i][j]=='P'&&(l&2)!=0)continue; dp[j][now][0]=(dp[j][now][0]+dp[j-1][k][l])%mod; } } } //printf("%d\n",dp[len][0][0]+dp[len][0][1]+dp[len][0][2]+dp[len][0][3]); for(int j=0;j<=len;j++) { for(int k=0;k<=3;k++)lans[i][j][k]=dp[len][j][k]; //printf("%d %d %d\n",i,j,lans[i][j]); } dp2[0][0][0][0]=1; for(int j=1;j<=len;j++)for(int k=0;k<=len;k++)for(int l=0;l<=3;l++)dp2[j][k][l][0]=dp2[j][k][l][1]=0; for(int j=1;j<=len;j++) { for(int k=0;k<=j-1;k++) { for(int l=0;l<=3;l++) { int sth=l; if(s[i][len+1-j]=='L')sth|=1; else sth|=2; dp2[j][k][sth][0]=(dp2[j][k][sth][0]+dp2[j-1][k][l][0])%mod; dp2[j][k][sth][1]=(dp2[j][k][sth][1]+dp2[j-1][k][l][1])%mod; } } for(int k=0;k<=j-1;k++) { int now=k; if(s[i][len+1-j]=='P')now++; else now--; if(now<0)continue; for(int l=0;l<=3;l++) { if(s[i][len+1-j]=='L'&&(l&1)!=0)continue; if(s[i][len+1-j]=='P'&&(l&2)!=0)continue; int gre=0; if(s[i][len+1-j]=='L')gre=0; else gre=1; dp2[j][now][0][gre]=(dp2[j][now][0][gre]+dp2[j-1][k][l][0])%mod; dp2[j][now][0][gre]=(dp2[j][now][0][gre]+dp2[j-1][k][l][1])%mod; } } } for(int j=0;j<=len;j++) { for(int k=0;k<=3;k++)rans[i][j][0]=(rans[i][j][0]+dp2[len][j][k][0])%mod; for(int k=0;k<=3;k++)rans[i][j][1]=(rans[i][j][1]+dp2[len][j][k][1])%mod; //printf("%d %d %d %d\n",i,j,rans[i][j][0],rans[i][j][1]); } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int ans=mod-1; int tlen=min(strlen(s[i]+1),strlen(s[j]+1)); for(int k=0;k<=tlen;k++) { for(int l=0;l<=3;l++) { for(int r=0;r<=1;r++) { if((l&(1<<r))!=0)continue; ans=(ans+1LL*lans[i][k][l]*rans[j][k][r]%mod)%mod; } } } ans=(ans+lans[i][0][1])%mod; ans=(ans+lans[i][0][3])%mod; printf("%d ",ans); } printf("\n"); } }
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | #include<bits/stdc++.h> #define mod 1000000007 using namespace std; inline int read() { int n=0,f=1,ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { n=n*10+ch-'0'; ch=getchar(); } return n*f; } char s[605][605]; int dp[605][605][4]; int dp2[605][605][4][2]; int lans[605][605][4],rans[605][605][2]; int main() { int n; n=read(); for(int i=1;i<=n;i++) { scanf("%s",s[i]+1); } for(int i=1;i<=n;i++) { dp[0][0][0]=1; int len=strlen(s[i]+1); for(int j=1;j<=len;j++)for(int k=0;k<=len;k++)for(int l=0;l<=3;l++)dp[j][k][l]=0; for(int j=1;j<=len;j++) { for(int k=0;k<=j-1;k++) { for(int l=0;l<=3;l++) { int sth=l; if(s[i][j]=='L')sth|=1; else sth|=2; dp[j][k][sth]=(dp[j][k][sth]+dp[j-1][k][l])%mod; //printf("%d %d %d %d\n",j,k,sth,dp[j][k][sth]); } } for(int k=0;k<=j-1;k++) { int now=k; if(s[i][j]=='L')now++; else now--; if(now<0)continue; for(int l=0;l<=3;l++) { if(s[i][j]=='L'&&(l&1)!=0)continue; if(s[i][j]=='P'&&(l&2)!=0)continue; dp[j][now][0]=(dp[j][now][0]+dp[j-1][k][l])%mod; } } } //printf("%d\n",dp[len][0][0]+dp[len][0][1]+dp[len][0][2]+dp[len][0][3]); for(int j=0;j<=len;j++) { for(int k=0;k<=3;k++)lans[i][j][k]=dp[len][j][k]; //printf("%d %d %d\n",i,j,lans[i][j]); } dp2[0][0][0][0]=1; for(int j=1;j<=len;j++)for(int k=0;k<=len;k++)for(int l=0;l<=3;l++)dp2[j][k][l][0]=dp2[j][k][l][1]=0; for(int j=1;j<=len;j++) { for(int k=0;k<=j-1;k++) { for(int l=0;l<=3;l++) { int sth=l; if(s[i][len+1-j]=='L')sth|=1; else sth|=2; dp2[j][k][sth][0]=(dp2[j][k][sth][0]+dp2[j-1][k][l][0])%mod; dp2[j][k][sth][1]=(dp2[j][k][sth][1]+dp2[j-1][k][l][1])%mod; } } for(int k=0;k<=j-1;k++) { int now=k; if(s[i][len+1-j]=='P')now++; else now--; if(now<0)continue; for(int l=0;l<=3;l++) { if(s[i][len+1-j]=='L'&&(l&1)!=0)continue; if(s[i][len+1-j]=='P'&&(l&2)!=0)continue; int gre=0; if(s[i][len+1-j]=='L')gre=0; else gre=1; dp2[j][now][0][gre]=(dp2[j][now][0][gre]+dp2[j-1][k][l][0])%mod; dp2[j][now][0][gre]=(dp2[j][now][0][gre]+dp2[j-1][k][l][1])%mod; } } } for(int j=0;j<=len;j++) { for(int k=0;k<=3;k++)rans[i][j][0]=(rans[i][j][0]+dp2[len][j][k][0])%mod; for(int k=0;k<=3;k++)rans[i][j][1]=(rans[i][j][1]+dp2[len][j][k][1])%mod; //printf("%d %d %d %d\n",i,j,rans[i][j][0],rans[i][j][1]); } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int ans=mod-1; int tlen=min(strlen(s[i]+1),strlen(s[j]+1)); for(int k=0;k<=tlen;k++) { for(int l=0;l<=3;l++) { for(int r=0;r<=1;r++) { if((l&(1<<r))!=0)continue; ans=(ans+1LL*lans[i][k][l]*rans[j][k][r]%mod)%mod; } } } ans=(ans+lans[i][0][1])%mod; ans=(ans+lans[i][0][3])%mod; printf("%d ",ans); } printf("\n"); } } |