提交时间:2024-11-19 14:52:24
运行 ID: 34852
#include<bits/stdc++.h> #define int long long #define double long double using namespace std; double p; int n,m; string s; double dp[2005][2005],ans;//0,1 int sz[1000006],ch[1000006][2],tot; void insert(string s){ int p=0; for(int i=0;i<s.size();i++){ if(!ch[p][s[i]-'0'])ch[p][s[i]-'0']=++tot; p=ch[p][s[i]-'0']; sz[p]++; } } void calc(int p){ ans*=dp[sz[ch[p][0]]][sz[ch[p][1]]]; if(ch[p][0])calc(ch[p][0]); if(ch[p][1])calc(ch[p][1]); } signed main(){ cin>>n>>m>>p; p=max(p,1-p); dp[0][0]=1; dp[1][0]=dp[0][1]=p; // cout<<p<<" "<<1-p<<endl; for(int i=2;i<=1000;i++){ for(int j=0;j<=min(i,1000ll);j++){ int k=i-j; if(j==0)dp[j][k]=dp[j][k-1]*p; else if(k==0)dp[j][k]=dp[j-1][k]*p; else dp[j][k]=max(p*(dp[j-1][k])+(1.0-p)*(dp[j][k-1]),(1.0-p)*(dp[j-1][k])+p*(dp[j][k-1])); } } for(int i=1;i<=n;i++){ cin>>s; insert(s); } ans=1; calc(0); // for(int i=0;i<3;i++){ // for(int j=0;j<3;j++)cout<<dp[i][j]<<" ";cout<<endl; // } printf("%.20Lf",ans); return 0; }