提交时间:2024-11-19 13:29:16

运行 ID: 34838

#include<bits/stdc++.h> using namespace std; #define int long long #define LD long double #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=1010,MAXM=1010,N=18; int n,m,rt,id[MAXN]; string ejz(int x){string res="";for(int i=0;i<n;i++)res+=x&(1<<i)?"1":"0";return res;} struct Edge{int v,nx;LD w;}edge[MAXN];int h[MAXN],CNT;void add_side(int u,int v,LD w){edge[++CNT]={v,h[u],w};h[u]=CNT;} LD p,g[MAXN][MAXN],f[MAXN],ans; char c[MAXN]; struct trie{ int t[MAXN*MAXM][2],num[MAXN*MAXM],cnt; void insert(){if(!cnt)cnt=1; int pos=1; f[0]=1; num[pos]++; for(int i=1;i<=m;i++){ if(!t[pos][c[i]-'0'])t[pos][c[i]-'0']=++cnt; pos=t[pos][c[i]-'0']; num[pos]++; } } void dfs(int u){ if(t[u][0])dfs(t[u][0]); if(t[u][1])dfs(t[u][1]); ans*=g[num[t[u][0]]][num[t[u][1]]]; } }T; void slv(){ n=read(),m=read(); scanf("%Lf",&p); p=max(p,1-p); for(int i=1;i<=n;i++){ scanf("%s",c+1); T.insert(); } g[0][0]=1; for(int i=1;i<=n;i++)g[0][i]=g[i][0]=g[0][i-1]*p; for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)g[i][j]=i>j?g[i-1][j]*p+g[i][j-1]*(1-p):g[i-1][j]*(1-p)+g[i][j-1]*p; ans=1; T.dfs(1); printf("%.12Lf",ans); } signed main(){ slv(); return 0; }