#include<iostream> #include<vector> #include<string> using namespace std; int main(){ int mod = 1000000007; int n; cin>>n; vector<string>data(n); for(int i = 0; i < n; i++) cin >> data[i]; vector<int>temp1(601, 0); vector<vector<vector<int>>> dp; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ vector<vector<int>> temp2(data[i].size() + data[j].size(), temp1); dp.push_back(temp2); } } //DZIALA for(int i0 = 0; i0 < n; i0++) for(int j1 = 0; j1 < n; j1++){ int i = n*i0 + j1; string s = data[i0] + data[j1]; int prevR = -1; int prevL = -1; int maxPower = 0; for(int j = 0; j < s.size(); j++){ char c = s[j]; dp[i][j][0] = 0; if(c == 'P'){ if(prevR != -1)dp[i][j][0] += dp[i][prevR][1]; dp[i][j][0]%=mod; if(prevL != -1)dp[i][j][0] += dp[i][prevL][1]; dp[i][j][0]%=mod; }else{ dp[i][j][1]++; } int last = maxPower + 1; if(last > 600)last = 600; for(int k = 1; k <= last; k++){ int sum = dp[i][j][k]; int pow; if(c == 'L') pow = k - 1; else pow = k + 1; if(prevL != -1)sum += dp[i][prevL][pow]; sum%= mod; if(prevR != -1)sum += dp[i][prevR][pow]; sum%= mod; dp[i][j][k] = sum; if(k == maxPower + 1 && sum > 0)maxPower++; } if(c == 'L')prevL = j; else prevR = j; } } /*for(int i = 0; i < n; i++) for(int j = 0; j< n; j++){ string s = data[i] + data[j]; cout<<s<<endl; for(int k = 0; k < s.size(); k++){ cout<<s[k]<<": "; for(int l = 0; l <= s.size(); l++){ cout<<dp[i*n + j][k][l]<< " "; } cout<<endl; } }*/ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ string s = data[i] + data[j]; int lastR = s.size() - 1; while(s[lastR] == 'L')lastR--; cout<<dp[i*n + j][lastR][0] % mod<<" "; } cout<<'\n'; } /*for(int i = 0; i < n*n; i++){ string s = data[i] + data[]; if(i%n == n - 1)cout<<'\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 | #include<iostream> #include<vector> #include<string> using namespace std; int main(){ int mod = 1000000007; int n; cin>>n; vector<string>data(n); for(int i = 0; i < n; i++) cin >> data[i]; vector<int>temp1(601, 0); vector<vector<vector<int>>> dp; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ vector<vector<int>> temp2(data[i].size() + data[j].size(), temp1); dp.push_back(temp2); } } //DZIALA for(int i0 = 0; i0 < n; i0++) for(int j1 = 0; j1 < n; j1++){ int i = n*i0 + j1; string s = data[i0] + data[j1]; int prevR = -1; int prevL = -1; int maxPower = 0; for(int j = 0; j < s.size(); j++){ char c = s[j]; dp[i][j][0] = 0; if(c == 'P'){ if(prevR != -1)dp[i][j][0] += dp[i][prevR][1]; dp[i][j][0]%=mod; if(prevL != -1)dp[i][j][0] += dp[i][prevL][1]; dp[i][j][0]%=mod; }else{ dp[i][j][1]++; } int last = maxPower + 1; if(last > 600)last = 600; for(int k = 1; k <= last; k++){ int sum = dp[i][j][k]; int pow; if(c == 'L') pow = k - 1; else pow = k + 1; if(prevL != -1)sum += dp[i][prevL][pow]; sum%= mod; if(prevR != -1)sum += dp[i][prevR][pow]; sum%= mod; dp[i][j][k] = sum; if(k == maxPower + 1 && sum > 0)maxPower++; } if(c == 'L')prevL = j; else prevR = j; } } /*for(int i = 0; i < n; i++) for(int j = 0; j< n; j++){ string s = data[i] + data[j]; cout<<s<<endl; for(int k = 0; k < s.size(); k++){ cout<<s[k]<<": "; for(int l = 0; l <= s.size(); l++){ cout<<dp[i*n + j][k][l]<< " "; } cout<<endl; } }*/ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ string s = data[i] + data[j]; int lastR = s.size() - 1; while(s[lastR] == 'L')lastR--; cout<<dp[i*n + j][lastR][0] % mod<<" "; } cout<<'\n'; } /*for(int i = 0; i < n*n; i++){ string s = data[i] + data[]; if(i%n == n - 1)cout<<'\n'; }*/ return 0; } |