#include <bits/stdc++.h> using namespace std; const int MOD = 1e9 + 7; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<string> in(n); for (int i = 0; i <n; i++) cin >> in[i]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { string d = in[i] + in[j]; int k = d.size(); vector<vector<int>> dp(k); int offset = k+1; for (int i = 0; i < k; i++) dp[i].assign(2*offset + 5, 0); bool dupa = false; int lastl, lastr; lastl = lastr = -1; if (d[0] == 'L') { dp[0][offset+1] = 1; dupa =true; lastl = 0; } else { lastr = 0; } for (int p = 1; p < k; p++) { for (int l = 0; l < 2*offset; l++) { if (d[p] == 'L' && l != 2*offset - 1) { dp[p][l + 1] += dp[p-1][l]; dp[p][l+1] %= MOD; if (lastl > 0) { dp[p][l+1] -= dp[lastl - 1][l] - MOD; dp[p][l+1] %= MOD; } } else if (l - offset > 0) { dp[p][l - 1] += dp[p-1][l]; dp[p][l-1] %= MOD; if (lastr > 0) { dp[p][l-1] -= dp[lastr - 1][l] - MOD; dp[p][l-1] %= MOD; } } dp[p][l] += dp[p-1][l]; dp[p][l] %= MOD; } if (!dupa && d[p] == 'L') { dp[p][offset+1]++; dp[p][offset+1] %= MOD; dupa = true; } if (d[p] == 'L') lastl = p; else lastr = p; } cout << dp[k - 1][offset] << " "; } 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 | #include <bits/stdc++.h> using namespace std; const int MOD = 1e9 + 7; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<string> in(n); for (int i = 0; i <n; i++) cin >> in[i]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { string d = in[i] + in[j]; int k = d.size(); vector<vector<int>> dp(k); int offset = k+1; for (int i = 0; i < k; i++) dp[i].assign(2*offset + 5, 0); bool dupa = false; int lastl, lastr; lastl = lastr = -1; if (d[0] == 'L') { dp[0][offset+1] = 1; dupa =true; lastl = 0; } else { lastr = 0; } for (int p = 1; p < k; p++) { for (int l = 0; l < 2*offset; l++) { if (d[p] == 'L' && l != 2*offset - 1) { dp[p][l + 1] += dp[p-1][l]; dp[p][l+1] %= MOD; if (lastl > 0) { dp[p][l+1] -= dp[lastl - 1][l] - MOD; dp[p][l+1] %= MOD; } } else if (l - offset > 0) { dp[p][l - 1] += dp[p-1][l]; dp[p][l-1] %= MOD; if (lastr > 0) { dp[p][l-1] -= dp[lastr - 1][l] - MOD; dp[p][l-1] %= MOD; } } dp[p][l] += dp[p-1][l]; dp[p][l] %= MOD; } if (!dupa && d[p] == 'L') { dp[p][offset+1]++; dp[p][offset+1] %= MOD; dupa = true; } if (d[p] == 'L') lastl = p; else lastr = p; } cout << dp[k - 1][offset] << " "; } cout << '\n'; } } |