#include <iostream> using namespace std; #define MOD 1000000007 class Sequence { int mem[1448][1448] = {{0}}; int NL[1448], NP[1448], len; Sequence *next = nullptr; public: Sequence(string S, Sequence *next) { this->next = next; len = S.length(); int CP = len, CL = len; NL[len]=NP[len]=len; for (int j = len - 1; j>=0; j--) { if (S[j] == 'P') CP = j; else CL=j; NL[j] = CL; NP[j] = CP; } } int run(int last, int cnt) { // cout << last << " " << cnt << endl; if (last >= 0 && mem[last][cnt] > 0) return mem[last][cnt]-1; int ret = cnt ? 0 : 1; int nidx = NL[last + 1]; if (nidx < len) { ret = (ret + run(nidx, cnt + 1)) % MOD; } else if (next != nullptr) { nidx = next->NL[0]; if (nidx < next->len) ret = (ret + next->run(nidx, cnt + 1)) % MOD; } if (cnt > 0) { nidx = NP[last + 1]; if (nidx < len) { ret = (ret + run(nidx, cnt - 1)) % MOD; } else if (next != nullptr) { nidx = next->NP[0]; if (nidx < next->len) ret = (ret + next->run(nidx, cnt - 1)) % MOD; } } if (last>=0) mem[last][cnt] = ret + 1; return ret; } }; int main() { string SS[1000]; Sequence *ST[1000]; int N; cin >> N; for (int i = 0; i < N; i++) { cin >> SS[i]; ST[i] = new Sequence(SS[i], nullptr); } Sequence *foo = new Sequence(SS[0], ST[0]); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { Sequence *foo = new Sequence(SS[i], ST[j]); cout << (foo->run(-1,0)-1); if (j < N -1) cout << " "; delete foo; } cout << endl; } 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 | #include <iostream> using namespace std; #define MOD 1000000007 class Sequence { int mem[1448][1448] = {{0}}; int NL[1448], NP[1448], len; Sequence *next = nullptr; public: Sequence(string S, Sequence *next) { this->next = next; len = S.length(); int CP = len, CL = len; NL[len]=NP[len]=len; for (int j = len - 1; j>=0; j--) { if (S[j] == 'P') CP = j; else CL=j; NL[j] = CL; NP[j] = CP; } } int run(int last, int cnt) { // cout << last << " " << cnt << endl; if (last >= 0 && mem[last][cnt] > 0) return mem[last][cnt]-1; int ret = cnt ? 0 : 1; int nidx = NL[last + 1]; if (nidx < len) { ret = (ret + run(nidx, cnt + 1)) % MOD; } else if (next != nullptr) { nidx = next->NL[0]; if (nidx < next->len) ret = (ret + next->run(nidx, cnt + 1)) % MOD; } if (cnt > 0) { nidx = NP[last + 1]; if (nidx < len) { ret = (ret + run(nidx, cnt - 1)) % MOD; } else if (next != nullptr) { nidx = next->NP[0]; if (nidx < next->len) ret = (ret + next->run(nidx, cnt - 1)) % MOD; } } if (last>=0) mem[last][cnt] = ret + 1; return ret; } }; int main() { string SS[1000]; Sequence *ST[1000]; int N; cin >> N; for (int i = 0; i < N; i++) { cin >> SS[i]; ST[i] = new Sequence(SS[i], nullptr); } Sequence *foo = new Sequence(SS[0], ST[0]); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { Sequence *foo = new Sequence(SS[i], ST[j]); cout << (foo->run(-1,0)-1); if (j < N -1) cout << " "; delete foo; } cout << endl; } return 0; } |