10 2 2 hello world 4 1 1 icpc 10 0 0 0 0 0
2 1 14195065
#include<algorithm> #include<iostream> #include<string.h> #include<sstream> #include<stdio.h> #include<math.h> #include<vector> #include<string> #include<queue> #include<set> #include<map> using namespace std; const int INF=0x3f3f3f3f; const double eps=1e-8; const double PI=acos(-1.0); const int mod=20090717; const int md=150; const int ssz=26; const int maxn=30; int ch[md][ssz],val[md],f[md],last[md]; int sz,dp[maxn][md][1<<11],one[1<<11],bi[11]; int idx(char c) { return c-'a'; } void init() { sz=1; val[0]=0; memset(ch[0],0,sizeof ch[0]); } void Insert(char *s,int v) { int u=0,n=strlen(s); for(int i=0; i<n; i++) { int c=idx(s[i]); if(!ch[u][c]) { memset(ch[sz],0,sizeof ch[sz]); val[sz]=0; ch[u][c]=sz++; } u=ch[u][c]; } val[u]=v; } void getf() { queue<int> q; int u,v,c,r; f[0]=0; for(c=0;c<ssz;c++) { u=ch[0][c]; if(u) { f[u]=0; q.push(u); last[u]=0; } } while(!q.empty()) { r=q.front(); q.pop(); val[r]|=val[f[r]]; for(c=0;c<ssz;c++) { u=ch[r][c]; if(!u) { ch[r][c]=ch[f[r]][c]; continue; } q.push(u); v=f[r]; while(v&&!ch[v][c]) v=f[v]; f[u]=ch[v][c]; } } } void solve(int n,int k,int ms) { int i,j,s,c,v,ns,ans; getf(); for(i=0;i<=n;i++) for(j=0;j<sz;j++) for(s=0;s<ms;s++) dp[i][j][s]=0; dp[0][0][0]=1; for(i=0;i<n;i++) for(j=0;j<sz;j++) for(s=0;s<ms;s++) { if(!dp[i][j][s]) continue; for(c=0;c<ssz;c++) { v=ch[j][c],ns=s|val[v]; dp[i+1][v][ns]=(dp[i+1][v][ns]+dp[i][j][s])%mod; } } ans=0; for(s=0;s<ms;s++) { if(one[s]<k) continue; for(i=0;i<sz;i++) ans=(ans+dp[n][i][s])%mod; } printf("%d\n",ans); } int getone(int x) { int c=0; while(x) { c+=x&1; x>>=1; } return c; } int main() { int i,n,m,k; char magic[20]; bi[0]=1; for(i=1;i<11;i++) bi[i]=bi[i-1]<<1; for(i=0;i<bi[10];i++) one[i]=getone(i); while(scanf("%d%d%d",&n,&m,&k),n||m||k) { init(); for(i=0;i<m;i++) { scanf("%s",magic); Insert(magic,bi[i]); } solve(n,k,bi[m]); } return 0; }
hdu 2825 Wireless Password(ac自动机&dp),布布扣,bubuko.com
hdu 2825 Wireless Password(ac自动机&dp)
原文:http://blog.csdn.net/bossup/article/details/31020853