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
| #include<bits/stdc++.h> using namespace std;
const int N=2e3+10,INF=1e9,MOD=1e9+7; inline void mod(int &x){ if(x>=MOD) x-=MOD; if(x<0) x+=MOD; } inline int qm(int x,int y=MOD-2){ int res=1; for(;y;y>>=1,x=1ll*x*x%MOD) if(y&1) res=1ll*res*x%MOD; return res; } #define gc getchar() #define rd read() inline int read(){ int x=0,f=0; char c=gc; for(;c<'0'||c>'9';c=gc) f|=(c=='-'); for(;c>='0'&&c<='9';c=gc) x=(x<<1)+(x<<3)+(c^48); return f?-x:x; }
int jc[N*3],fjc[N*3]; inline void _init(int n){ jc[0]=1; for(int i=1;i<=n;++i) jc[i]=1ll*jc[i-1]*i%MOD; fjc[n]=qm(jc[n]); for(int i=n-1;~i;--i) fjc[i]=1ll*fjc[i+1]*(i+1)%MOD; } inline int C(int n,int m){ return m>n||n<0||m<0?0:1ll*jc[n]*fjc[m]%MOD*fjc[n-m]%MOD; } inline int P(int n,int m){ return m>n||n<0||m<0?0:1ll*jc[n]*fjc[n-m]%MOD; }
int n,all=0,f[N*3][2],g[N*3][2],ans=1,cnt=0; char s[3][N]; inline int chk(){ if(s[0][1]=='x'||s[2][1]=='x'||s[0][n]=='x'||s[2][n]=='x') return 0; for(int i=1;i<n;++i){ if(s[0][i]=='x'&&s[0][i+1]=='x') return 0; if(s[2][i]=='x'&&s[2][i+1]=='x') return 0; } return 1; }
void init(int i){ all=(s[0][i]=='x')+(s[2][i]=='x')+1; for(int j=1;j<=all;++j) f[j][0]=f[j][1]=0; f[all][0]=jc[all-1]; for(int i=1;i<all;++i) f[i][1]=jc[all-1]; for(int j=1;j<=all;++j) mod(g[j][0]=g[j-1][0]+f[j][0]),mod(g[j][1]=g[j-1][1]+f[j][1]); } void get(int i){ int c=(s[0][i]=='x')+(s[2][i]=='x'); all+=c+1; for(int j=1;j<=all;++j) f[j][0]=f[j][1]=0; for(int j=c+1;j<=all;++j) mod(f[j][0]+=1ll*P(j-1,c)*g[all-c-1][0]%MOD); for(int j=c+1;j<=all;++j) mod(f[j][0]+=1ll*P(j-1,c)*(g[all-c-1][1]-g[j-c-1][1])%MOD); for(int x=0;x<c;++x) for(int j=1;j<=all-c;++j) mod(f[j+x][1]+=1ll*jc[c]*C(j+x-1,j-1)%MOD*C(all-j-x,c-x)%MOD*g[j-1][0]%MOD); for(int j=1;j<=all;++j) mod(g[j][0]=g[j-1][0]+f[j][0]),mod(g[j][1]=g[j-1][1]+f[j][1]); }
int main(){
n=rd,scanf("%s %s %s", s[0]+1, s[1]+1, s[2]+1); if(!chk()) return printf("0\n"),0; _init(n*3);
for(int i=1,j;i<=n;i=j){ if(s[1][i]=='o') cnt+=(s[0][i]=='x')+(s[2][i]=='x'),j=i+1; else{ for(j=i;j<=n&&s[1][j]==s[1][i];++j); init(i); for(int k=i+1;k<j;++k) get(k); ans=1ll*(g[all][0]+g[all][1])%MOD*ans%MOD*fjc[all]%MOD,cnt+=all; } } ans=1ll*ans*jc[cnt]%MOD;
printf("%d\n", ans);
return 0; }
|