提交时间:2024-11-19 14:21:04
运行 ID: 34849
#include<bits/stdc++.h> #define int long long #define doub long double using namespace std; const int N=1007; int n,m; doub p; doub f[N][N]; int tr[N*N][2]; int cnt[N*N]; int tot=1; doub ans=1; inline void DFS(int u,int d){ if(!d)return; if(tr[u][0])DFS(tr[u][0],d-1); if(tr[u][1])DFS(tr[u][1],d-1); ans*=f[cnt[tr[u][0]]][cnt[tr[u][1]]]; } signed main(){ #ifndef ONLINE_JUDGE freopen("string.in","r",stdin); freopen("string.out","w",stdout); #endif cin>>n>>m>>p; p=max(p,1-p); f[0][0]=1; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ if((!i)&&(!j))continue; if(i>=j){ if(i)f[i][j]+=p*f[i-1][j]; if(j)f[i][j]+=(1-p)*f[i][j-1]; } else{ if(j)f[i][j]+=p*f[i][j-1]; if(i)f[i][j]+=(1-p)*f[i-1][j]; } } } for(int i=1;i<=n;i++){ int u=1; for(int j=1;j<=m;j++){ cnt[u]++; char ch;cin>>ch; int c=ch-'0'; if(!tr[u][c])tr[u][c]=++tot; u=tr[u][c]; } cnt[u]++; } DFS(1,m); cout<<fixed<<setprecision(12)<<ans<<endl; return 0; }