#include <iostream> using namespace std; const int M = 1000000007; int dp[1207][1207]; //int second[607][607]; // [slowo][otwarte] //int first[607][607]; char reverse(char c) { if (c == 'L') return 'P'; else return 'L'; } string reverse(string s) { int i = 0, j = s.length() - 1; while (i <= j) { swap(s[i], s[j]); i++; j--; } for (i = 0; i < s.length(); i++) { s[i] = reverse(s[i]); } return s; } void compute(string s) { int n = s.length(); s = "#" + s; int nextL = -1, nextR = -1; for (int last = n; last >= 0; last--) { for (int o = 0; o <= n; o++) { if (o == 0) dp[last][o] = 1; else dp[last][o] = 0; if (o < n && nextL != -1) dp[last][o] += dp[nextL][o + 1]; dp[last][o] %= M; if (o > 0 && nextR != -1) dp[last][o] += dp[nextR][o - 1]; dp[last][o] %= M; } if (s[last] == 'L') nextL = last; else nextR = last; } cout << dp[0][0] - 1 << " "; } string words[607]; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> words[i]; // compute(words[i]); // for (int o = 0; o <= words[i].length(); o++) { // second[i][o] = dp[0][o]; // } // compute(reverse(words[i])); // for (int o = 0; o <= words[i].length(); o++) { // first[i][o] = dp[0][o]; // } } int ile = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { string s = words[i] + words[j]; compute(s); // cout << dp[0][0] << " "; // int ile = 0; // for (int k = 0; k <= min(words[i].size(), words[j].size()); k++) { // ile += ((first[i][k] * second[j][k]) % M); // ile %= M; // } // cout << ile << " "; } 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 90 | #include <iostream> using namespace std; const int M = 1000000007; int dp[1207][1207]; //int second[607][607]; // [slowo][otwarte] //int first[607][607]; char reverse(char c) { if (c == 'L') return 'P'; else return 'L'; } string reverse(string s) { int i = 0, j = s.length() - 1; while (i <= j) { swap(s[i], s[j]); i++; j--; } for (i = 0; i < s.length(); i++) { s[i] = reverse(s[i]); } return s; } void compute(string s) { int n = s.length(); s = "#" + s; int nextL = -1, nextR = -1; for (int last = n; last >= 0; last--) { for (int o = 0; o <= n; o++) { if (o == 0) dp[last][o] = 1; else dp[last][o] = 0; if (o < n && nextL != -1) dp[last][o] += dp[nextL][o + 1]; dp[last][o] %= M; if (o > 0 && nextR != -1) dp[last][o] += dp[nextR][o - 1]; dp[last][o] %= M; } if (s[last] == 'L') nextL = last; else nextR = last; } cout << dp[0][0] - 1 << " "; } string words[607]; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> words[i]; // compute(words[i]); // for (int o = 0; o <= words[i].length(); o++) { // second[i][o] = dp[0][o]; // } // compute(reverse(words[i])); // for (int o = 0; o <= words[i].length(); o++) { // first[i][o] = dp[0][o]; // } } int ile = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { string s = words[i] + words[j]; compute(s); // cout << dp[0][0] << " "; // int ile = 0; // for (int k = 0; k <= min(words[i].size(), words[j].size()); k++) { // ile += ((first[i][k] * second[j][k]) % M); // ile %= M; // } // cout << ile << " "; } cout << "\n"; } } |