#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; } |
English