#include<bits/stdc++.h> using namespace std; int n,dlu[602]; bool dry[602][602]; unsigned long long dp[602][2][2]; unsigned long long dp2[602][2][2]; unsigned long long mod=1000000007; unsigned long long staldp[602][602][2][2],ilezer[602]; int ileL[602]; int najw[602]; //czekam na L/P //ostatni L/P int main() { scanf("%d",&n); getchar(); char wcz; for(int i=0;i^n;++i) { wcz=getchar(); while(wcz=='L'||wcz=='P') { dry[i][dlu[i]]=(wcz=='P'); if(wcz=='L') ++ileL[i]; ++dlu[i]; wcz=getchar(); } } for(int i=0;i^n;++i) { dp[0][1][0]=1; dp[0][0][0]=0; dp[0][0][1]=0; dp[0][1][1]=0; for(int j=dlu[i]-1;j>=0;--j) { if(dry[i][j]) { ++najw[i]; dp[najw[i]][0][0]=0; dp[najw[i]][0][1]=0; dp[najw[i]][1][0]=0; dp[najw[i]][1][1]=0; for(int k=najw[i];k;--k) { dp[k][0][1]=(dp[k][0][1]+dp[k-1][1][0]+dp[k-1][1][1])%mod; dp[k][1][1]=(dp[k-1][1][0]+dp[k-1][1][1])%mod; staldp[i][k][0][1]=(staldp[i][k][0][1]+dp[k-1][1][0]+dp[k-1][1][1])%mod; staldp[i][k][1][1]=(staldp[i][k][1][1]+dp[k-1][1][0]+dp[k-1][1][1])%mod; dp[k-1][1][0]=0; } dp[0][1][1]=0; } else if(najw[i]) { dp[0][0][0]=(dp[0][0][0]+dp[1][0][0]+dp[1][0][1])%mod; dp[0][1][0]=(dp[0][1][0]+dp[1][0][0]+dp[1][0][1])%mod; dp[1][0][0]=0; dp[1][0][1]=0; for(int k=1;k^najw[i];++k) { dp[k][0][0]=(dp[k+1][0][0]+dp[k+1][0][1])%mod; dp[k][1][0]=(dp[k][1][0]+dp[k+1][0][0]+dp[k+1][0][1])%mod; staldp[i][k][1][0]=(staldp[i][k][1][0]+dp[k+1][0][0]+dp[k+1][0][1])%mod; staldp[i][k][0][0]=(staldp[i][k][0][0]+dp[k+1][0][0]+dp[k+1][0][1])%mod; dp[k+1][0][1]=0; } dp[najw[i]][0][0]=0; } } ilezer[i]=dp[0][0][0]; } int njw; for(int i=0;i^n;++i) { dp2[0][0][1]=1; dp2[0][1][0]=0; dp2[0][1][1]=0; dp2[0][0][0]=0; njw=0; for(int j=0;j^dlu[i];++j) { if(!dry[i][j]) { ++njw; dp2[njw][0][1]=0; dp2[njw][1][0]=0; dp2[njw][1][1]=0; dp2[njw][0][0]=0; for(int k=njw;k;--k) { dp2[k][0][0]=(dp2[k-1][0][0]+dp2[k-1][0][1])%mod; dp2[k][1][0]=(dp2[k][1][0]+dp2[k-1][0][0]+dp2[k-1][0][1])%mod; dp2[k-1][0][1]=0; } dp2[0][0][0]=0; } else if(njw) { dp2[0][0][1]=(dp2[0][0][1]+dp2[1][1][0]+dp2[1][1][1])%mod; dp2[0][1][1]=(dp2[0][1][1]+dp2[1][1][0]+dp2[1][1][1])%mod; dp2[1][1][0]=0; for(int k=1;k<njw;++k) { dp2[k][0][1]=(dp2[k][0][1]+dp2[k+1][1][0]+dp2[k+1][1][1])%mod; dp2[k][1][1]=(dp2[k+1][1][0]+dp2[k+1][1][1])%mod; dp2[k+1][1][0]=0; } dp2[njw][1][1]=0; } } for(int j=0;j^n;++j) { long long dowy=dp2[0][1][1]; for(int k=min(najw[j],njw);k;--k) { dowy=(dowy+staldp[j][k][0][0]*dp2[k][0][0]+staldp[j][k][0][1]*dp2[k][1][0]+staldp[j][k][1][0]*dp2[k][0][1]+staldp[j][k][1][1]*dp2[k][1][1])%mod; } if(ileL[i]) dowy=(dowy+ilezer[j]*dp2[0][0][1])%mod; else dowy=ilezer[j]; printf("%lld ",dowy); } putchar('\n'); } 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 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 | #include<bits/stdc++.h> using namespace std; int n,dlu[602]; bool dry[602][602]; unsigned long long dp[602][2][2]; unsigned long long dp2[602][2][2]; unsigned long long mod=1000000007; unsigned long long staldp[602][602][2][2],ilezer[602]; int ileL[602]; int najw[602]; //czekam na L/P //ostatni L/P int main() { scanf("%d",&n); getchar(); char wcz; for(int i=0;i^n;++i) { wcz=getchar(); while(wcz=='L'||wcz=='P') { dry[i][dlu[i]]=(wcz=='P'); if(wcz=='L') ++ileL[i]; ++dlu[i]; wcz=getchar(); } } for(int i=0;i^n;++i) { dp[0][1][0]=1; dp[0][0][0]=0; dp[0][0][1]=0; dp[0][1][1]=0; for(int j=dlu[i]-1;j>=0;--j) { if(dry[i][j]) { ++najw[i]; dp[najw[i]][0][0]=0; dp[najw[i]][0][1]=0; dp[najw[i]][1][0]=0; dp[najw[i]][1][1]=0; for(int k=najw[i];k;--k) { dp[k][0][1]=(dp[k][0][1]+dp[k-1][1][0]+dp[k-1][1][1])%mod; dp[k][1][1]=(dp[k-1][1][0]+dp[k-1][1][1])%mod; staldp[i][k][0][1]=(staldp[i][k][0][1]+dp[k-1][1][0]+dp[k-1][1][1])%mod; staldp[i][k][1][1]=(staldp[i][k][1][1]+dp[k-1][1][0]+dp[k-1][1][1])%mod; dp[k-1][1][0]=0; } dp[0][1][1]=0; } else if(najw[i]) { dp[0][0][0]=(dp[0][0][0]+dp[1][0][0]+dp[1][0][1])%mod; dp[0][1][0]=(dp[0][1][0]+dp[1][0][0]+dp[1][0][1])%mod; dp[1][0][0]=0; dp[1][0][1]=0; for(int k=1;k^najw[i];++k) { dp[k][0][0]=(dp[k+1][0][0]+dp[k+1][0][1])%mod; dp[k][1][0]=(dp[k][1][0]+dp[k+1][0][0]+dp[k+1][0][1])%mod; staldp[i][k][1][0]=(staldp[i][k][1][0]+dp[k+1][0][0]+dp[k+1][0][1])%mod; staldp[i][k][0][0]=(staldp[i][k][0][0]+dp[k+1][0][0]+dp[k+1][0][1])%mod; dp[k+1][0][1]=0; } dp[najw[i]][0][0]=0; } } ilezer[i]=dp[0][0][0]; } int njw; for(int i=0;i^n;++i) { dp2[0][0][1]=1; dp2[0][1][0]=0; dp2[0][1][1]=0; dp2[0][0][0]=0; njw=0; for(int j=0;j^dlu[i];++j) { if(!dry[i][j]) { ++njw; dp2[njw][0][1]=0; dp2[njw][1][0]=0; dp2[njw][1][1]=0; dp2[njw][0][0]=0; for(int k=njw;k;--k) { dp2[k][0][0]=(dp2[k-1][0][0]+dp2[k-1][0][1])%mod; dp2[k][1][0]=(dp2[k][1][0]+dp2[k-1][0][0]+dp2[k-1][0][1])%mod; dp2[k-1][0][1]=0; } dp2[0][0][0]=0; } else if(njw) { dp2[0][0][1]=(dp2[0][0][1]+dp2[1][1][0]+dp2[1][1][1])%mod; dp2[0][1][1]=(dp2[0][1][1]+dp2[1][1][0]+dp2[1][1][1])%mod; dp2[1][1][0]=0; for(int k=1;k<njw;++k) { dp2[k][0][1]=(dp2[k][0][1]+dp2[k+1][1][0]+dp2[k+1][1][1])%mod; dp2[k][1][1]=(dp2[k+1][1][0]+dp2[k+1][1][1])%mod; dp2[k+1][1][0]=0; } dp2[njw][1][1]=0; } } for(int j=0;j^n;++j) { long long dowy=dp2[0][1][1]; for(int k=min(najw[j],njw);k;--k) { dowy=(dowy+staldp[j][k][0][0]*dp2[k][0][0]+staldp[j][k][0][1]*dp2[k][1][0]+staldp[j][k][1][0]*dp2[k][0][1]+staldp[j][k][1][1]*dp2[k][1][1])%mod; } if(ileL[i]) dowy=(dowy+ilezer[j]*dp2[0][0][1])%mod; else dowy=ilezer[j]; printf("%lld ",dowy); } putchar('\n'); } return 0; } |