标签:
10 2 2 hello world 4 1 1 icpc 10 0 0 0 0 0
2 1 14195065
#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; const int MOD=20090717; int dp[30][110][1<<10]; int n,m,k; int cal(int x) { int cnt=0; for(int i=0;i<10;i++) if(x&(1<<i)) cnt++; return cnt; } struct AC{ int next[110][26]; int fail[110]; int 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 id=buf[i]-'a'; if(next[now][id]==-1) next[now][id]=newnode(); now=next[now][id]; } 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]); } } } } int solve() { CLEAR(dp,0); dp[0][0][0]=1; for(int i=0;i<n;i++) { for(int j=0;j<L;j++) { for(int k=0;k<(1<<m);k++) { if(dp[i][j][k]) { for(int x=0;x<26;x++) { int id=next[j][x]; int st=k|ed[id]; dp[i+1][id][st]+=dp[i][j][k]; dp[i+1][id][st]%=MOD; } } } } } int ans=0; for(int i=0;i<(1<<m);i++) { if(cal(i)>=k) { for(int j=0;j<L;j++) ans=(ans+dp[n][j][i])%MOD; } } printf("%d\n",ans); } }; AC A; int main() { char str[20]; while(~scanf("%d%d%d",&n,&m,&k)) { if(n+m+k==0) break; A.init(); for(int i=0;i<m;i++) { scanf("%s",str); A.Insert(str,i); } A.Build_AC(); A.solve(); } return 0; } /* */
HDU 2825 Wireless Password(自动机+DP)
标签:
原文地址:http://blog.csdn.net/u013582254/article/details/45159477