#include <algorithm> #include <cstdio> #include <string> #include <vector> using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define FORD(i,a,b) for(int i=(b)-1;i>=(a);--i) #define REP(i,n) FOR(i,0,n) #define REPD(i,n) FORD(i,0,n) #define VAR(v,w) __typeof(w) v=(w) #define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it) #define PB push_back #define ALL(c) (c).begin(),(c).end() #define SIZE(c) ((int)(c).size()) #define INT(x) int x; scanf("%d", &x) #define STR(n,x) char x[n]; scanf("%s", x) typedef long long LL; typedef vector<int> VI; typedef vector<string> VS; typedef vector<VI> VVI; const int mod = 1000000007; int r[601][601], ls[601], ps[601]; bool ifl[601], ifp[601]; void go(const string& a, VI& vf, VI& vfl, VI& vfp, int& vflp, VI& vel, VI& vep) { int n = SIZE(a); ifl[n] = ifp[n] = 0; REPD(i,n) { ifl[i] = ifl[i + 1] || a[i] == 'L'; ifp[i] = ifp[i + 1] || a[i] == 'P'; } r[0][0] = ls[0] = ps[0] = 1; FOR(j,1,n+1) r[0][j] = ls[j] = ps[j] = 0; FOR(i,1,n+1) { if (a[i - 1] == 'L') { r[i][0] = 0; FOR(j,1,n+1) r[i][j] = ls[j - 1]; REP(j,n+1) ls[j] = r[i][j]; REP(j,n+1) ps[j] = (ps[j] + r[i][j]) % mod; } else { REP(j,n) r[i][j] = ps[j + 1]; r[i][n] = 0; REP(j,n+1) ps[j] = r[i][j]; REP(j,n+1) ls[j] = (ls[j] + r[i][j]) % mod; } } vf.clear(); vfl.clear(); vfp.clear(); vflp = 0; vel.clear(); vep.clear(); vf.resize(n + 1); vfl.resize(n + 1); vfp.resize(n + 1); vel.resize(n + 1); vep.resize(n + 1); REP(i,n+1) { if (ifl[i] && ifp[i]) { vflp = (vflp + r[i][0]) % mod; } else if (ifl[i]) { REP(j,n+1) vfl[j] = (vfl[j] + r[i][j]) % mod; } else if (ifp[i]) { REP(j,n+1) vfp[j] = (vfp[j] + r[i][j]) % mod; } if (i) { if (a[i - 1] == 'L') { REP(j,n+1) vel[j] = (vel[j] + r[i][j]) % mod; } else { REP(j,n+1) vep[j] = (vep[j] + r[i][j]) % mod; } } } REP(j,n+1) vf[j] = r[n][j]; } int main() { INT(n); VS a; REP(i,n) { STR(601, aa); a.PB(aa); } VVI vf, vfl, vfp; VI vflp; REP(i,n) { VI vf0, vfl0, vfp0, vel0, vep0; int vflp0; go(a[i], vf0, vfl0, vfp0, vflp0, vel0, vep0); vf.PB(vf0); vfl.PB(vfl0); vfp.PB(vfp0); vflp.PB(vflp0); } REP(i,n) { reverse(ALL(a[i])); FORE(it,a[i]) *it = 'P' - *it + 'L'; } VVI wel, wep; REP(i,n) { VI wf0, wfl0, wfp0, wel0, wep0; int wflp0; go(a[i], wf0, wfl0, wfp0, wflp0, wel0, wep0); wel.PB(wel0); wep.PB(wep0); } REP(i,n) { const int* vf0 = vf[i].data(); const int* vfl0 = vfl[i].data(); const int* vfp0 = vfp[i].data(); int vflp0 = vflp[i]; REP(j,n) { const int* wel0 = wel[j].data(); const int* wep0 = wep[j].data(); if (j) printf(" "); int x = min(SIZE(vf[i]), SIZE(wel[j])); int res = mod - 1; REP(k,x) res = (res + LL(vf0[k] + vfl0[k]) * wel0[k] + LL(vf0[k] + vfp0[k]) * wep0[k]) % mod; res = (LL(res) + vf0[0] + vfl0[0] + vfp0[0] + vflp0) % mod; printf("%d", res); } printf("\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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <algorithm> #include <cstdio> #include <string> #include <vector> using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define FORD(i,a,b) for(int i=(b)-1;i>=(a);--i) #define REP(i,n) FOR(i,0,n) #define REPD(i,n) FORD(i,0,n) #define VAR(v,w) __typeof(w) v=(w) #define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it) #define PB push_back #define ALL(c) (c).begin(),(c).end() #define SIZE(c) ((int)(c).size()) #define INT(x) int x; scanf("%d", &x) #define STR(n,x) char x[n]; scanf("%s", x) typedef long long LL; typedef vector<int> VI; typedef vector<string> VS; typedef vector<VI> VVI; const int mod = 1000000007; int r[601][601], ls[601], ps[601]; bool ifl[601], ifp[601]; void go(const string& a, VI& vf, VI& vfl, VI& vfp, int& vflp, VI& vel, VI& vep) { int n = SIZE(a); ifl[n] = ifp[n] = 0; REPD(i,n) { ifl[i] = ifl[i + 1] || a[i] == 'L'; ifp[i] = ifp[i + 1] || a[i] == 'P'; } r[0][0] = ls[0] = ps[0] = 1; FOR(j,1,n+1) r[0][j] = ls[j] = ps[j] = 0; FOR(i,1,n+1) { if (a[i - 1] == 'L') { r[i][0] = 0; FOR(j,1,n+1) r[i][j] = ls[j - 1]; REP(j,n+1) ls[j] = r[i][j]; REP(j,n+1) ps[j] = (ps[j] + r[i][j]) % mod; } else { REP(j,n) r[i][j] = ps[j + 1]; r[i][n] = 0; REP(j,n+1) ps[j] = r[i][j]; REP(j,n+1) ls[j] = (ls[j] + r[i][j]) % mod; } } vf.clear(); vfl.clear(); vfp.clear(); vflp = 0; vel.clear(); vep.clear(); vf.resize(n + 1); vfl.resize(n + 1); vfp.resize(n + 1); vel.resize(n + 1); vep.resize(n + 1); REP(i,n+1) { if (ifl[i] && ifp[i]) { vflp = (vflp + r[i][0]) % mod; } else if (ifl[i]) { REP(j,n+1) vfl[j] = (vfl[j] + r[i][j]) % mod; } else if (ifp[i]) { REP(j,n+1) vfp[j] = (vfp[j] + r[i][j]) % mod; } if (i) { if (a[i - 1] == 'L') { REP(j,n+1) vel[j] = (vel[j] + r[i][j]) % mod; } else { REP(j,n+1) vep[j] = (vep[j] + r[i][j]) % mod; } } } REP(j,n+1) vf[j] = r[n][j]; } int main() { INT(n); VS a; REP(i,n) { STR(601, aa); a.PB(aa); } VVI vf, vfl, vfp; VI vflp; REP(i,n) { VI vf0, vfl0, vfp0, vel0, vep0; int vflp0; go(a[i], vf0, vfl0, vfp0, vflp0, vel0, vep0); vf.PB(vf0); vfl.PB(vfl0); vfp.PB(vfp0); vflp.PB(vflp0); } REP(i,n) { reverse(ALL(a[i])); FORE(it,a[i]) *it = 'P' - *it + 'L'; } VVI wel, wep; REP(i,n) { VI wf0, wfl0, wfp0, wel0, wep0; int wflp0; go(a[i], wf0, wfl0, wfp0, wflp0, wel0, wep0); wel.PB(wel0); wep.PB(wep0); } REP(i,n) { const int* vf0 = vf[i].data(); const int* vfl0 = vfl[i].data(); const int* vfp0 = vfp[i].data(); int vflp0 = vflp[i]; REP(j,n) { const int* wel0 = wel[j].data(); const int* wep0 = wep[j].data(); if (j) printf(" "); int x = min(SIZE(vf[i]), SIZE(wel[j])); int res = mod - 1; REP(k,x) res = (res + LL(vf0[k] + vfl0[k]) * wel0[k] + LL(vf0[k] + vfp0[k]) * wep0[k]) % mod; res = (LL(res) + vf0[0] + vfl0[0] + vfp0[0] + vflp0) % mod; printf("%d", res); } printf("\n"); } } |