标签:
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<bitset> using namespace std; #define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i ) #define REP( i , n ) for ( int i = 0 ; i < n ; ++ i ) #define CLEAR( a , x ) memset ( a , x , sizeof a ) typedef long long LL; typedef pair<int,int>pil; const int INF = 0x3f3f3f3f; double dp[20][110][(1<<8)+10]; int t,n,l; struct AC{ int next[110][26]; int fail[110],ed[110]; int root,L; int newnode() { for(int i=0;i<26;i++) next[L][i]=-1; ed[L++]=0; return L-1; } void init() { L=0; root=newnode(); } void Insert(char buf[],int id) { int len=strlen(buf); int now=root; for(int i=0;i<len;i++) { int x=buf[i]-'a'; if(next[now][x]==-1) next[now][x]=newnode(); now=next[now][x]; } ed[now]|=(1<<id); } void Build_AC() { queue<int>q; fail[root]=root; for(int i=0;i<26;i++) { if(next[root][i]==-1) next[root][i]=root; else { fail[next[root][i]]=root; q.push(next[root][i]); } } while(!q.empty()) { int now=q.front(); q.pop();ed[now]|=ed[fail[now]]; for(int i=0;i<26;i++) { if(next[now][i]==-1) next[now][i]=next[fail[now]][i]; else { fail[next[now][i]]=next[fail[now]][i]; q.push(next[now][i]); } } } } void solve() { CLEAR(dp,0); dp[0][0][0]=1.0; for(int i=0;i<l;i++) { for(int j=0;j<L;j++) { for(int k=0;k<(1<<n);k++) { if(dp[i][j][k]!=0) { for(int h=0;h<26;h++) { int now=next[j][h]; dp[i+1][now][ed[now]|k]+=1.0/26*dp[i][j][k]; } } } } } double ans=0; for(int i=0;i<L;i++) { for(int j=0;j<(1<<n);j++) { int cnt=0; for(int k=0;k<26;k++) if(j&(1<<k)) cnt++; ans+=cnt*dp[l][i][j]; } } printf("%.6f\n",ans); } }; AC A; int main() { char str[20]; scanf("%d",&t); while(t--) { A.init(); scanf("%d%d",&n,&l); REP(i,n) { scanf("%s",str); A.Insert(str,i); } A.Build_AC(); A.solve(); } return 0; } /* 3 1 1 a 3 4 cyy fzz sama 8 14 fatezero nisekoi nogamenolife monthlygirls nozakikun datealive sakura sora */
标签:
原文地址:http://blog.csdn.net/u013582254/article/details/45203331