#include <bits/stdc++.h> using namespace std; #define M 600 #define N 1'000'000'007 bool E(char s){ return s=='P'; } bool B(char s){ if(s=='L') return -1; return 1; } int main(){ int n; cin>>n; vector<string> tab(n); for(auto&x:tab) cin>>x; int next[n][M][2]; //0-L, 1-P int prev[n][M][2]; for(int i=0;i<n;i++){ int lastL=-1, lastP=-1; for(int j=tab[i].size()-1;j>=0;j--){ (tab[i][j]=='L' ? lastL : lastP) = j; next[i][j][0] = lastL; next[i][j][1] = lastP; } lastL=-1, lastP=-1; for(int j=0;j<tab[i].size();j++){ prev[i][j][0] = lastL; prev[i][j][1] = lastP; (tab[i][j]=='L' ? lastL : lastP) = j; } } // for(int i=0;i<n;i++){ // cout<<tab[i]<<endl; // for(int j=0;j<tab[i].size();j++) cout<< next[i][j][0]<<" "; cout<<endl; // for(int j=0;j<tab[i].size();j++) cout<< next[i][j][1]<<" "; cout<<endl; // cout<<endl; // } int b[n][2][M]; for(int i=0;i<n;i++){ int l=tab[i].size(); int bal[l+1][M]; bal[l][0]=1; for(int i=1;i<M;i++) bal[l][i]=0; //L-R // for(int k=0;k<9;k++) // cout<<bal[l][k]<<" "; // cout<<endl; for(int j=l-1;j>=0;j--){ // cout<<j<<": "<<next[i][j][0]<<" "<<next[i][j][1]<<endl; // cout<<next[i][j][0]+1<<" "<<0<<" "<<bal[next[i][j][0]+1][0]<<endl; bal[j][0]=1; for(int k=1;k<M;k++) bal[j][k] = 0; if(next[i][j][0]!=-1) for(int k=0;k<M-1;k++) bal[j][k] += bal[next[i][j][0]+1][k+1]; if(next[i][j][1]!=-1) for(int k=1;k<M;k++) bal[j][k] += bal[next[i][j][1]+1][k-1]; for(int k=0;k<M;k++) bal[j][k] %= N; // for(int k=0;k<9;k++) // cout<<bal[j][k]<<" "; // cout<<endl; } if(tab[i][0]=='L'){ for(int j=0;j<M;j++) b[i][0][j]=bal[1][j]; if(next[i][0][1]==-1) for(int j=0;j<M;j++) b[i][1][j]=0; else for(int j=0;j<M;j++) b[i][1][j]=bal[next[i][0][1]+1][j]; } else{ for(int j=0;j<M;j++) b[i][1][j]=bal[1][j]; if(next[i][0][0]==-1) for(int j=0;j<M;j++) b[i][0][j]=0; else for(int j=0;j<M;j++) b[i][0][j]=bal[next[i][0][0]+1][j]; } // cout<<"RES:\n"; // for(int j=0;j<7;j++) cout<<b[i][0][j]<<" ";cout<<endl; // for(int j=0;j<7;j++) cout<<b[i][1][j]<<" ";cout<<endl; // cout<<endl; } for(int i=0;i<n;i++){ int l=tab[i].size(); int bal[l+1][M]; // #define bal_(i) bal[i+1] // for(int i=0;i<M;i++) bal[0][i]=0; //L-P // bal[0][0]=1; // for(int k=0;k<9;k++) // cout<<bal[0][k]<<" "; // cout<<endl; int lastT[2][M], sum=0; char lastV; for(auto&x:lastT[0])x=0; for(auto&x:lastT[1])x=0; lastV=tab[i][0]; int lastL=-1, lastP=-1; for(int j=0;j<l;j++){ int S = tab[i][j]=='L'; int S2 = 1-2*S; for(int k=0;k<M;k++) bal[j][k] = 0; if(prev[i][j][0]==-1 && tab[i][j]=='L') bal[j][1]=1; if(lastV!=tab[i][j]){ if(prev[i][j][1]!=-1) for(int k=S;k<M-1+S;k++) bal[j][k] += lastT[1][k+S2]; if(prev[i][j][0]!=-1) for(int k=S;k<M-1+S;k++) bal[j][k] += lastT[0][k+S2]; } else if(j!=0){ int S = tab[i][j-1]=='L'; for(int k=S;k<M-1+S;k++) bal[j][k] += bal[j-1][k+S2]; } for(int k=0;k<M;k++) bal[j][k] %= N; if(lastV!=tab[i][j]){ for(int k=0;k<M;k++) lastT[S][k]=bal[j-1][k]; for(int k=0;k<M;k++) lastT[1-S][k]=bal[j][k]; } else{ for(int k=0;k<M;k++) lastT[1-S][k]+=bal[j][k]; } lastV=tab[i][j]; if(lastV=='L') lastL=j; else lastP=j; sum+=bal[j][0]; // cout<<"L "; for(int k=0;k<9;k++) cout<<lastT[0][k]<<" "; cout<<endl; // cout<<"L "; for(int k=0;k<9;k++) cout<<lastT[1][k]<<" "; cout<<endl<<" "; // for(int k=0;k<9;k++) cout<<bal[j][k]<<" "; // cout<<"<"<<tab[i][j]<<endl; } // cout<<"last: "<<lastL<<" "<<lastP<<endl; // if(lastL!=-1) for(int k=0;k<8;k++) cout<< bal[lastL][k]<<" ";cout<<endl; // if(lastP!=-1) for(int k=0;k<8;k++) cout<< bal[lastP][k]<<" "; cout<<endl; for(int j=0;j<n;j++){ int sum2=0; if(lastL==-1){ sum2+=b[j][0][1]; }else if(lastL==l-1){ for(int k=0;k<M-1;k++) sum2 =( sum2+bal[lastL][k]*(b[j][0][k+1]))%N; for(int k=1;k<M;k++) sum2 = (sum2+lastT[0][k]*(b[j][1][k-1]))%N; for(int k=1;k<M;k++) sum2 = (sum2+bal[lastP][k]*(b[j][1][k-1]))%N; }else if(lastP==-1){ for(int k=0;k<M-1;k++) sum2 =( sum2+bal[lastL][k]*(b[j][0][k+1]))%N; for(int k=1;k<M;k++) sum2 =( sum2+lastT[0][k]*(b[j][1][k-1]))%N; }else{ // cout<<"{_"<<sum<<"}"; // cout<<"{"<<bal[lastP][0]<<" "<<b[j][0][0+1]<<"}"; // cout<<"{"<<sum2<<"}"; for(int k=0;k<M-1;k++) sum2 = (sum2+lastT[1][k]*(b[j][0][k+1]))%N; // cout<<"{"<<sum2<<"}"; for(int k=1;k<M;k++) sum2 =( sum2+bal[lastP][k]*(b[j][1][k-1]))%N; // cout<<"{"<<sum2<<"}"; for(int k=0;k<M-1;k++) sum2 = (sum2+bal[lastL][k]*(b[j][0][k+1]))%N; } // cout<<"[" <<i<<","<<j<<": "<<sum2<<" "<<sum<<"]\n"; cout<< sum2+sum<<" "; } cout<<endl; // if(tab[i][0]=='L'){ // for(int j=0;j<M;j++) b[i][0][j]=bal[1][j]; // if(next[i][0][1]==-1) for(int j=0;j<M;j++) b[i][1][j]=0; // else for(int j=0;j<M;j++) b[i][1][j]=bal[next[i][0][1]+1][j]; // } // else{ // for(int j=0;j<M;j++) b[i][1][j]=bal[1][j]; // if(next[i][0][0]==-1) for(int j=0;j<M;j++) b[i][0][j]=0; // else for(int j=0;j<M;j++) b[i][0][j]=bal[next[i][0][0]+1][j]; // } // cout<<"RES:\n"; // for(int j=0;j<7;j++) cout<<b[i][0][j]<<" ";cout<<endl; // for(int j=0;j<7;j++) cout<<b[i][1][j]<<" ";cout<<endl; // cout<<endl; } return 0; /* for(int i=0;i<n;i++){ int l=tab[i].size(); int p[l+1][3][2*M]; for(int k=0;k<2*M;k++) p[l][0][k] = p[l][1][k] = p[l][2][k] = 0; p[l][0][M]=p[l][1][M]=p[l][2][M]=1; cout<<i<<endl; for(int j=l-1;j>=0;j--){ for(int k=0;k<2*M;k++) p[j][0][k] = p[j][1][k] = p[j][2][k] = 0; p[j][2][M]+=1; if(tab[i][j]=='L'){ for(int k=0;k<2*M-1;k++) for(int A=0;A<3;A++) p[j][A][k] += p[j+1][A][k+1]; if(next[i][j][1]==-1) p[j][1][M] += 1; else for(int k=1;k<2*M;k++) for(int A=0;A<3;A++) p[j][A][k] += p[next[i][j][1]+1][A][k-1]; } else{ for(int k=1;k<2*M;k++) for(int A=0;A<3;A++) p[j][A][k] += p[j+1][A][k-1]; if(next[i][j][0]==-1) p[j][0][M] += 1; else for(int k=0;k<2*M-1;k++) for(int A=0;A<3;A++) p[j][A][k] += p[next[i][j][0]+1][A][k+1]; } // if(next[i][j][0]==-1) // p[j][0][M] += 1; // else for(int k=0;k<2*M-1;k++) for(int A=0;A<3;A++) // p[j][A][k] += p[next[i][j][0]+1][A][k+1]; // if(next[i][j][1]==-1) // p[j][1][M] += 1; // else for(int k=1;k<2*M;k++) for(int A=0;A<3;A++) // p[j][A][k] += p[next[i][j][1]+1][A][k-1]; for(int k=-6;k<6;k++) cout<<(k==0?"_":"")<<p[j][0][k+M]<<" ";cout<<endl; for(int k=-6;k<6;k++) cout<<(k==0?"_":"")<<p[j][1][k+M]<<" ";cout<<endl; for(int k=-6;k<6;k++) cout<<(k==0?"_":"")<<p[j][2][k+M]<<" ";cout<<endl; cout<<endl; } cout<<"res: "; int res=p[i][2][M]; } */ }
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 | #include <bits/stdc++.h> using namespace std; #define M 600 #define N 1'000'000'007 bool E(char s){ return s=='P'; } bool B(char s){ if(s=='L') return -1; return 1; } int main(){ int n; cin>>n; vector<string> tab(n); for(auto&x:tab) cin>>x; int next[n][M][2]; //0-L, 1-P int prev[n][M][2]; for(int i=0;i<n;i++){ int lastL=-1, lastP=-1; for(int j=tab[i].size()-1;j>=0;j--){ (tab[i][j]=='L' ? lastL : lastP) = j; next[i][j][0] = lastL; next[i][j][1] = lastP; } lastL=-1, lastP=-1; for(int j=0;j<tab[i].size();j++){ prev[i][j][0] = lastL; prev[i][j][1] = lastP; (tab[i][j]=='L' ? lastL : lastP) = j; } } // for(int i=0;i<n;i++){ // cout<<tab[i]<<endl; // for(int j=0;j<tab[i].size();j++) cout<< next[i][j][0]<<" "; cout<<endl; // for(int j=0;j<tab[i].size();j++) cout<< next[i][j][1]<<" "; cout<<endl; // cout<<endl; // } int b[n][2][M]; for(int i=0;i<n;i++){ int l=tab[i].size(); int bal[l+1][M]; bal[l][0]=1; for(int i=1;i<M;i++) bal[l][i]=0; //L-R // for(int k=0;k<9;k++) // cout<<bal[l][k]<<" "; // cout<<endl; for(int j=l-1;j>=0;j--){ // cout<<j<<": "<<next[i][j][0]<<" "<<next[i][j][1]<<endl; // cout<<next[i][j][0]+1<<" "<<0<<" "<<bal[next[i][j][0]+1][0]<<endl; bal[j][0]=1; for(int k=1;k<M;k++) bal[j][k] = 0; if(next[i][j][0]!=-1) for(int k=0;k<M-1;k++) bal[j][k] += bal[next[i][j][0]+1][k+1]; if(next[i][j][1]!=-1) for(int k=1;k<M;k++) bal[j][k] += bal[next[i][j][1]+1][k-1]; for(int k=0;k<M;k++) bal[j][k] %= N; // for(int k=0;k<9;k++) // cout<<bal[j][k]<<" "; // cout<<endl; } if(tab[i][0]=='L'){ for(int j=0;j<M;j++) b[i][0][j]=bal[1][j]; if(next[i][0][1]==-1) for(int j=0;j<M;j++) b[i][1][j]=0; else for(int j=0;j<M;j++) b[i][1][j]=bal[next[i][0][1]+1][j]; } else{ for(int j=0;j<M;j++) b[i][1][j]=bal[1][j]; if(next[i][0][0]==-1) for(int j=0;j<M;j++) b[i][0][j]=0; else for(int j=0;j<M;j++) b[i][0][j]=bal[next[i][0][0]+1][j]; } // cout<<"RES:\n"; // for(int j=0;j<7;j++) cout<<b[i][0][j]<<" ";cout<<endl; // for(int j=0;j<7;j++) cout<<b[i][1][j]<<" ";cout<<endl; // cout<<endl; } for(int i=0;i<n;i++){ int l=tab[i].size(); int bal[l+1][M]; // #define bal_(i) bal[i+1] // for(int i=0;i<M;i++) bal[0][i]=0; //L-P // bal[0][0]=1; // for(int k=0;k<9;k++) // cout<<bal[0][k]<<" "; // cout<<endl; int lastT[2][M], sum=0; char lastV; for(auto&x:lastT[0])x=0; for(auto&x:lastT[1])x=0; lastV=tab[i][0]; int lastL=-1, lastP=-1; for(int j=0;j<l;j++){ int S = tab[i][j]=='L'; int S2 = 1-2*S; for(int k=0;k<M;k++) bal[j][k] = 0; if(prev[i][j][0]==-1 && tab[i][j]=='L') bal[j][1]=1; if(lastV!=tab[i][j]){ if(prev[i][j][1]!=-1) for(int k=S;k<M-1+S;k++) bal[j][k] += lastT[1][k+S2]; if(prev[i][j][0]!=-1) for(int k=S;k<M-1+S;k++) bal[j][k] += lastT[0][k+S2]; } else if(j!=0){ int S = tab[i][j-1]=='L'; for(int k=S;k<M-1+S;k++) bal[j][k] += bal[j-1][k+S2]; } for(int k=0;k<M;k++) bal[j][k] %= N; if(lastV!=tab[i][j]){ for(int k=0;k<M;k++) lastT[S][k]=bal[j-1][k]; for(int k=0;k<M;k++) lastT[1-S][k]=bal[j][k]; } else{ for(int k=0;k<M;k++) lastT[1-S][k]+=bal[j][k]; } lastV=tab[i][j]; if(lastV=='L') lastL=j; else lastP=j; sum+=bal[j][0]; // cout<<"L "; for(int k=0;k<9;k++) cout<<lastT[0][k]<<" "; cout<<endl; // cout<<"L "; for(int k=0;k<9;k++) cout<<lastT[1][k]<<" "; cout<<endl<<" "; // for(int k=0;k<9;k++) cout<<bal[j][k]<<" "; // cout<<"<"<<tab[i][j]<<endl; } // cout<<"last: "<<lastL<<" "<<lastP<<endl; // if(lastL!=-1) for(int k=0;k<8;k++) cout<< bal[lastL][k]<<" ";cout<<endl; // if(lastP!=-1) for(int k=0;k<8;k++) cout<< bal[lastP][k]<<" "; cout<<endl; for(int j=0;j<n;j++){ int sum2=0; if(lastL==-1){ sum2+=b[j][0][1]; }else if(lastL==l-1){ for(int k=0;k<M-1;k++) sum2 =( sum2+bal[lastL][k]*(b[j][0][k+1]))%N; for(int k=1;k<M;k++) sum2 = (sum2+lastT[0][k]*(b[j][1][k-1]))%N; for(int k=1;k<M;k++) sum2 = (sum2+bal[lastP][k]*(b[j][1][k-1]))%N; }else if(lastP==-1){ for(int k=0;k<M-1;k++) sum2 =( sum2+bal[lastL][k]*(b[j][0][k+1]))%N; for(int k=1;k<M;k++) sum2 =( sum2+lastT[0][k]*(b[j][1][k-1]))%N; }else{ // cout<<"{_"<<sum<<"}"; // cout<<"{"<<bal[lastP][0]<<" "<<b[j][0][0+1]<<"}"; // cout<<"{"<<sum2<<"}"; for(int k=0;k<M-1;k++) sum2 = (sum2+lastT[1][k]*(b[j][0][k+1]))%N; // cout<<"{"<<sum2<<"}"; for(int k=1;k<M;k++) sum2 =( sum2+bal[lastP][k]*(b[j][1][k-1]))%N; // cout<<"{"<<sum2<<"}"; for(int k=0;k<M-1;k++) sum2 = (sum2+bal[lastL][k]*(b[j][0][k+1]))%N; } // cout<<"[" <<i<<","<<j<<": "<<sum2<<" "<<sum<<"]\n"; cout<< sum2+sum<<" "; } cout<<endl; // if(tab[i][0]=='L'){ // for(int j=0;j<M;j++) b[i][0][j]=bal[1][j]; // if(next[i][0][1]==-1) for(int j=0;j<M;j++) b[i][1][j]=0; // else for(int j=0;j<M;j++) b[i][1][j]=bal[next[i][0][1]+1][j]; // } // else{ // for(int j=0;j<M;j++) b[i][1][j]=bal[1][j]; // if(next[i][0][0]==-1) for(int j=0;j<M;j++) b[i][0][j]=0; // else for(int j=0;j<M;j++) b[i][0][j]=bal[next[i][0][0]+1][j]; // } // cout<<"RES:\n"; // for(int j=0;j<7;j++) cout<<b[i][0][j]<<" ";cout<<endl; // for(int j=0;j<7;j++) cout<<b[i][1][j]<<" ";cout<<endl; // cout<<endl; } return 0; /* for(int i=0;i<n;i++){ int l=tab[i].size(); int p[l+1][3][2*M]; for(int k=0;k<2*M;k++) p[l][0][k] = p[l][1][k] = p[l][2][k] = 0; p[l][0][M]=p[l][1][M]=p[l][2][M]=1; cout<<i<<endl; for(int j=l-1;j>=0;j--){ for(int k=0;k<2*M;k++) p[j][0][k] = p[j][1][k] = p[j][2][k] = 0; p[j][2][M]+=1; if(tab[i][j]=='L'){ for(int k=0;k<2*M-1;k++) for(int A=0;A<3;A++) p[j][A][k] += p[j+1][A][k+1]; if(next[i][j][1]==-1) p[j][1][M] += 1; else for(int k=1;k<2*M;k++) for(int A=0;A<3;A++) p[j][A][k] += p[next[i][j][1]+1][A][k-1]; } else{ for(int k=1;k<2*M;k++) for(int A=0;A<3;A++) p[j][A][k] += p[j+1][A][k-1]; if(next[i][j][0]==-1) p[j][0][M] += 1; else for(int k=0;k<2*M-1;k++) for(int A=0;A<3;A++) p[j][A][k] += p[next[i][j][0]+1][A][k+1]; } // if(next[i][j][0]==-1) // p[j][0][M] += 1; // else for(int k=0;k<2*M-1;k++) for(int A=0;A<3;A++) // p[j][A][k] += p[next[i][j][0]+1][A][k+1]; // if(next[i][j][1]==-1) // p[j][1][M] += 1; // else for(int k=1;k<2*M;k++) for(int A=0;A<3;A++) // p[j][A][k] += p[next[i][j][1]+1][A][k-1]; for(int k=-6;k<6;k++) cout<<(k==0?"_":"")<<p[j][0][k+M]<<" ";cout<<endl; for(int k=-6;k<6;k++) cout<<(k==0?"_":"")<<p[j][1][k+M]<<" ";cout<<endl; for(int k=-6;k<6;k++) cout<<(k==0?"_":"")<<p[j][2][k+M]<<" ";cout<<endl; cout<<endl; } cout<<"res: "; int res=p[i][2][M]; } */ } |