#include <iostream> #include <string> #include <vector> #include <cstring> using namespace std; const int P=1000000000+7; //string s="PPLPLLPLPP"; string s="LLPP"; int dl=s.size(); bool jestL[1300][1300], jestP[1300][1300]; int ileLL[1300][1300], ilePP[1300][1300]; int pierwL(int pocz) { while (pocz<dl && s[pocz]!='L') ++pocz; return pocz; } int pierwP(int pocz) { while (pocz<dl && s[pocz]!='P') ++pocz; return pocz; } int ileP(int p, int nadL); int ileL(int l, int nadL) { int &w=ileLL[l][nadL]; if (jestL[l][nadL]) return w; jestL[l][nadL]=true; long long wyn=0; while (l<dl) { int p=pierwP(l+1); if (dl<=p) break; ++nadL; wyn+=ileP(p, nadL); l=pierwL(l+1); } return w=wyn%P; } int ileP(int p, int nadL) { int &w=ilePP[p][nadL]; if (jestP[p][nadL]) return w; jestP[p][nadL]=true; long long wyn=0; while (p<dl && 0<nadL) { --nadL; if (nadL==0) ++wyn; int l=pierwL(p+1); wyn+=ileL(l, nadL); p=pierwP(p+1); } return w=wyn%P; } int main() { ios_base::sync_with_stdio(false); int n; cin>>n; vector<string> d; for (int i=0; i<n; ++i) { string a; cin>>a; d.push_back(a); } for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { s=d[i]+d[j]; dl=s.size(); memset(jestL, 0, sizeof(jestL)); memset(jestP, 0, sizeof(jestP)); cout<<ileL(pierwL(0), 0)<<' '; } cout<<'\n'; } // cout<<ileL(pierwL(0), 0)<<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 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 | #include <iostream> #include <string> #include <vector> #include <cstring> using namespace std; const int P=1000000000+7; //string s="PPLPLLPLPP"; string s="LLPP"; int dl=s.size(); bool jestL[1300][1300], jestP[1300][1300]; int ileLL[1300][1300], ilePP[1300][1300]; int pierwL(int pocz) { while (pocz<dl && s[pocz]!='L') ++pocz; return pocz; } int pierwP(int pocz) { while (pocz<dl && s[pocz]!='P') ++pocz; return pocz; } int ileP(int p, int nadL); int ileL(int l, int nadL) { int &w=ileLL[l][nadL]; if (jestL[l][nadL]) return w; jestL[l][nadL]=true; long long wyn=0; while (l<dl) { int p=pierwP(l+1); if (dl<=p) break; ++nadL; wyn+=ileP(p, nadL); l=pierwL(l+1); } return w=wyn%P; } int ileP(int p, int nadL) { int &w=ilePP[p][nadL]; if (jestP[p][nadL]) return w; jestP[p][nadL]=true; long long wyn=0; while (p<dl && 0<nadL) { --nadL; if (nadL==0) ++wyn; int l=pierwL(p+1); wyn+=ileL(l, nadL); p=pierwP(p+1); } return w=wyn%P; } int main() { ios_base::sync_with_stdio(false); int n; cin>>n; vector<string> d; for (int i=0; i<n; ++i) { string a; cin>>a; d.push_back(a); } for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { s=d[i]+d[j]; dl=s.size(); memset(jestL, 0, sizeof(jestL)); memset(jestP, 0, sizeof(jestP)); cout<<ileL(pierwL(0), 0)<<' '; } cout<<'\n'; } // cout<<ileL(pierwL(0), 0)<<endl; return 0; } |