#pragma GCC optimize("O3,unroll-loops")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const int LIM=607, MOD=1e9+7;
string S[LIM];
int dp[LIM][LIM], pref[LIM][LIM][2], suf[LIM][LIM][2], zero[LIM], same[LIM];
void licz(string s) {
rep(i, s.size()) rep(j, s.size()+1) dp[i][j]=0;
rep(i, s.size()) if(s[i]=='L') {
dp[i][1]=1;
break;
}
rep(i, s.size()) {
if(s[i]=='L') {
for(int j=1; j<=s.size(); ++j) {
for(int l=i-1; l>=0; --l) {
dp[i][j]+=dp[l][j-1];
if(dp[i][j]>=MOD) dp[i][j]-=MOD;
if(s[l]=='L') break;
}
}
} else {
rep(j, s.size()) {
for(int l=i-1; l>=0; --l) {
dp[i][j]+=dp[l][j+1];
if(dp[i][j]>=MOD) dp[i][j]-=MOD;
if(s[l]=='P') break;
}
}
}
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int n;
cin >> n;
rep(i, n) {
cin >> S[i];
same[i]=1;
for(auto j : S[i]) if(j=='L') same[i]=0;
licz(S[i]);
rep(j, S[i].size()) {
zero[i]+=dp[j][0];
if(zero[i]>=MOD) zero[i]-=MOD;
}
bool czyl=false, czyp=false;
for(int j=S[i].size()-1; j>=0; --j) {
rep(l, S[i].size()+1) {
if(!czyl) {
pref[i][l][0]+=dp[j][l];
if(pref[i][l][0]>=MOD) pref[i][l][0]-=MOD;
}
if(!czyp) {
pref[i][l][1]+=dp[j][l];
if(pref[i][l][1]>=MOD) pref[i][l][1]-=MOD;
}
}
if(S[i][j]=='L') czyl=true;
else czyp=true;
}
reverse(all(S[i]));
rep(j, S[i].size()) if(S[i][j]=='L') S[i][j]='P'; else S[i][j]='L';
licz(S[i]);
rep(j, S[i].size()) rep(l, S[i].size()+1) {
if(S[i][j]=='L') {
suf[i][l][1]+=dp[j][l];
if(suf[i][l][1]>=MOD) suf[i][l][1]-=MOD;
} else {
suf[i][l][0]+=dp[j][l];
if(suf[i][l][0]>=MOD) suf[i][l][0]-=MOD;
}
}
}
rep(i, n) {
rep(j, n) {
ll ans=zero[i];
rep(l, LIM) ans=(ans+(ll)pref[i][l][0]*(ll)suf[j][l][0]+(ll)pref[i][l][1]*(ll)suf[j][l][1])%(ll)MOD;
if(same[i]) ans=zero[j];
cout << ans << " ";
}
cout << '\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 | #pragma GCC optimize("O3,unroll-loops") #include<bits/stdc++.h> using namespace std; typedef long long ll; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int LIM=607, MOD=1e9+7; string S[LIM]; int dp[LIM][LIM], pref[LIM][LIM][2], suf[LIM][LIM][2], zero[LIM], same[LIM]; void licz(string s) { rep(i, s.size()) rep(j, s.size()+1) dp[i][j]=0; rep(i, s.size()) if(s[i]=='L') { dp[i][1]=1; break; } rep(i, s.size()) { if(s[i]=='L') { for(int j=1; j<=s.size(); ++j) { for(int l=i-1; l>=0; --l) { dp[i][j]+=dp[l][j-1]; if(dp[i][j]>=MOD) dp[i][j]-=MOD; if(s[l]=='L') break; } } } else { rep(j, s.size()) { for(int l=i-1; l>=0; --l) { dp[i][j]+=dp[l][j+1]; if(dp[i][j]>=MOD) dp[i][j]-=MOD; if(s[l]=='P') break; } } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; rep(i, n) { cin >> S[i]; same[i]=1; for(auto j : S[i]) if(j=='L') same[i]=0; licz(S[i]); rep(j, S[i].size()) { zero[i]+=dp[j][0]; if(zero[i]>=MOD) zero[i]-=MOD; } bool czyl=false, czyp=false; for(int j=S[i].size()-1; j>=0; --j) { rep(l, S[i].size()+1) { if(!czyl) { pref[i][l][0]+=dp[j][l]; if(pref[i][l][0]>=MOD) pref[i][l][0]-=MOD; } if(!czyp) { pref[i][l][1]+=dp[j][l]; if(pref[i][l][1]>=MOD) pref[i][l][1]-=MOD; } } if(S[i][j]=='L') czyl=true; else czyp=true; } reverse(all(S[i])); rep(j, S[i].size()) if(S[i][j]=='L') S[i][j]='P'; else S[i][j]='L'; licz(S[i]); rep(j, S[i].size()) rep(l, S[i].size()+1) { if(S[i][j]=='L') { suf[i][l][1]+=dp[j][l]; if(suf[i][l][1]>=MOD) suf[i][l][1]-=MOD; } else { suf[i][l][0]+=dp[j][l]; if(suf[i][l][0]>=MOD) suf[i][l][0]-=MOD; } } } rep(i, n) { rep(j, n) { ll ans=zero[i]; rep(l, LIM) ans=(ans+(ll)pref[i][l][0]*(ll)suf[j][l][0]+(ll)pref[i][l][1]*(ll)suf[j][l][1])%(ll)MOD; if(same[i]) ans=zero[j]; cout << ans << " "; } cout << '\n'; } } |
English