#include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; typedef pair<int,long long> PIL; const int mod = 1e9+7; const int SZ = 604; string arr[605]; long long dp[605][605]; void calc(string s){ for(int i=0;i<SZ;i++) for(int j=0;j<SZ;j++) dp[i][j]=0; dp[0][0] = 1; int lastL = 0; int lastP = 0; for(int i=1;i<=s.size();i++){ if(s[i-1] == 'L'){ dp[i][0] = dp[i-1][0]; for(int k=1;k<=i;k++){ if(lastL > 0) dp[i][k] = (dp[i-1][k]+dp[i-1][k-1]-dp[lastL-1][k-1])%mod; else dp[i][k] = (dp[i-1][k]+dp[i-1][k-1])%mod; } lastL = i; } else{ for(int k=0;k<i;k++){ if(lastP > 0) dp[i][k] = (dp[i-1][k]+dp[i-1][k+1]-dp[lastP-1][k+1])%mod; else dp[i][k] = (dp[i-1][k]+dp[i-1][k+1])%mod; } lastP = i; } } } long long suf[605][3*SZ]; long long sufcpy[605][3*SZ]; long long V[3*SZ]; int mult(int ind){ long long res = 0; for(int i=0;i<3*SZ;i++){ res = (res+V[i]*suf[ind][i])%mod; } res--; while(res<0) res+=mod; return res; } int main(){ ios_base::sync_with_stdio(0); int n; cin>>n; for(int i=1;i<=n;i++){ cin>>arr[i]; } for(int i=1;i<=n;i++){ suf[i][0] = 1; for(int pos=arr[i].size()-1;pos>=0;pos--){ char x = arr[i][pos]; if(x == 'L'){ for(int j=0;j<SZ-1;j++) sufcpy[i][j] = (suf[i][j]+suf[i][j+1]+suf[i][j+SZ])%mod; sufcpy[i][SZ-1] = (suf[i][SZ-1]+suf[i][SZ-1+SZ])%mod; for(int j=0;j<SZ-1;j++) sufcpy[i][j+SZ] = -suf[i][j+1]; for(int j=0;j<SZ;j++) sufcpy[i][j+2*SZ] = suf[i][j+2*SZ]; } else{ sufcpy[i][0] = (suf[i][0]+suf[i][2*SZ])%mod; for(int j=1;j<SZ;j++) sufcpy[i][j] = (suf[i][j]+suf[i][j-1]+suf[i][j+2*SZ])%mod; for(int j=1;j<SZ;j++) sufcpy[i][j+2*SZ] = -suf[i][j-1]; for(int j=0;j<SZ;j++) sufcpy[i][j+SZ] = suf[i][j+SZ]; } for(int j=0;j<3*SZ;j++) suf[i][j] = sufcpy[i][j]; } } for(int i=1;i<=n;i++){ calc(arr[i]); int len = arr[i].size(); for(int j=0;j<3*SZ;j++) V[j] = 0; for(int j=0;j<SZ;j++) V[j] = dp[len][j]; for(int pos=len-1;pos>=0;pos--){ if(arr[i][pos] == 'L'){ for(int j=0;j<SZ;j++) V[j+SZ] = dp[pos][j]; break; } } for(int pos=len-1;pos>=0;pos--){ if(arr[i][pos] == 'P'){ for(int j=0;j<SZ;j++) V[j+2*SZ] = dp[pos][j]; break; } } for(int j=1;j<=n;j++){ cout<<mult(j)<<" "; } cout<<endl; } }
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 | #include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; typedef pair<int,long long> PIL; const int mod = 1e9+7; const int SZ = 604; string arr[605]; long long dp[605][605]; void calc(string s){ for(int i=0;i<SZ;i++) for(int j=0;j<SZ;j++) dp[i][j]=0; dp[0][0] = 1; int lastL = 0; int lastP = 0; for(int i=1;i<=s.size();i++){ if(s[i-1] == 'L'){ dp[i][0] = dp[i-1][0]; for(int k=1;k<=i;k++){ if(lastL > 0) dp[i][k] = (dp[i-1][k]+dp[i-1][k-1]-dp[lastL-1][k-1])%mod; else dp[i][k] = (dp[i-1][k]+dp[i-1][k-1])%mod; } lastL = i; } else{ for(int k=0;k<i;k++){ if(lastP > 0) dp[i][k] = (dp[i-1][k]+dp[i-1][k+1]-dp[lastP-1][k+1])%mod; else dp[i][k] = (dp[i-1][k]+dp[i-1][k+1])%mod; } lastP = i; } } } long long suf[605][3*SZ]; long long sufcpy[605][3*SZ]; long long V[3*SZ]; int mult(int ind){ long long res = 0; for(int i=0;i<3*SZ;i++){ res = (res+V[i]*suf[ind][i])%mod; } res--; while(res<0) res+=mod; return res; } int main(){ ios_base::sync_with_stdio(0); int n; cin>>n; for(int i=1;i<=n;i++){ cin>>arr[i]; } for(int i=1;i<=n;i++){ suf[i][0] = 1; for(int pos=arr[i].size()-1;pos>=0;pos--){ char x = arr[i][pos]; if(x == 'L'){ for(int j=0;j<SZ-1;j++) sufcpy[i][j] = (suf[i][j]+suf[i][j+1]+suf[i][j+SZ])%mod; sufcpy[i][SZ-1] = (suf[i][SZ-1]+suf[i][SZ-1+SZ])%mod; for(int j=0;j<SZ-1;j++) sufcpy[i][j+SZ] = -suf[i][j+1]; for(int j=0;j<SZ;j++) sufcpy[i][j+2*SZ] = suf[i][j+2*SZ]; } else{ sufcpy[i][0] = (suf[i][0]+suf[i][2*SZ])%mod; for(int j=1;j<SZ;j++) sufcpy[i][j] = (suf[i][j]+suf[i][j-1]+suf[i][j+2*SZ])%mod; for(int j=1;j<SZ;j++) sufcpy[i][j+2*SZ] = -suf[i][j-1]; for(int j=0;j<SZ;j++) sufcpy[i][j+SZ] = suf[i][j+SZ]; } for(int j=0;j<3*SZ;j++) suf[i][j] = sufcpy[i][j]; } } for(int i=1;i<=n;i++){ calc(arr[i]); int len = arr[i].size(); for(int j=0;j<3*SZ;j++) V[j] = 0; for(int j=0;j<SZ;j++) V[j] = dp[len][j]; for(int pos=len-1;pos>=0;pos--){ if(arr[i][pos] == 'L'){ for(int j=0;j<SZ;j++) V[j+SZ] = dp[pos][j]; break; } } for(int pos=len-1;pos>=0;pos--){ if(arr[i][pos] == 'P'){ for(int j=0;j<SZ;j++) V[j+2*SZ] = dp[pos][j]; break; } } for(int j=1;j<=n;j++){ cout<<mult(j)<<" "; } cout<<endl; } } |