标签:des style blog color io ar strong for 数据
Time Limit: 5000MS | Memory Limit: 10000K | |
Total Submissions: 8102 | Accepted: 2191 |
Description
Input
Output
Sample Input
2 3 1 ab bb
Sample Output
5
在AC自动机上dp,dp[i][j]表示走了i位,在ac自动机上第j个位置的方案数。ans比较大,要用高精度。
据说有些鬼畜的数据。所以不要用s[i]-32,用hash比较好
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<cstring> using namespace std; struct node{ node *fail; node *son[100]; int num; bool ar; node() { fail=NULL; ar=true; num=0; for(int i=0;i<100;i++)son[i]=NULL; } } *que[1011]; node *root; char s[1011]; int len,n,m,t,i,tot; node *ac[1011]; struct ans{ int n; int a[101]; }dp[61][601]; ans xzq; int hash[601]; ans plus(ans a,ans b) { ans c; int i; for(i=0;i<=100;i++)c.a[i]=0; if(a.n>b.n)c.n=a.n; else c.n=b.n; for(i=1;i<=c.n;i++){ c.a[i]=c.a[i]+a.a[i]+b.a[i]; if(c.a[i]>=10){ c.a[i+1]=c.a[i+1]+c.a[i]/10; c.a[i]=c.a[i]%10; } } c.n++; if(c.a[c.n]==0)c.n--; return c; } void Read() { len=0; char c; while(c=getchar(),c==‘\n‘); s[++len]=c; while(c=getchar(),c!=‘\n‘)s[++len]=c; } void add() { int i,ws; node *p; p=root; for(i=1;i<=len;i++){ ws=hash[s[i]]; if(p->son[ws]==NULL){ p->son[ws]=new node(); p->son[ws]->num=++tot; ac[tot]=p->son[ws]; } p=p->son[ws]; } p->ar=false; } void Bfs() { int l,r,i,j,k; node *p; node *q; que[l=r=1]=root; while(l<=r){ p=que[l]; for(i=1;i<=n;i++)if(p->son[i]!=NULL){ r++; que[r]=p->son[i]; if(p==root)p->son[i]->fail=root; else{ q=p->fail; while(q!=NULL){ if(q->son[i]!=NULL){ p->son[i]->fail=q->son[i]; break; } q=q->fail; } if(p->son[i]->fail==NULL)p->son[i]->fail=root; } } l++; } for(i=2;i<=r;i++)que[i]->ar&=que[i]->fail->ar; } void Main() { int i,j,k; node *p; node *q; dp[0][1].n=1; dp[0][1].a[1]=1; for(i=0;i<m;i++){ for(j=1;j<=tot;j++){ for(k=1;k<=n;k++){ p=ac[j]; if(p->son[k]!=NULL)p=p->son[k]; else{ q=p->fail; while(q!=NULL){ if(q->son[k]!=NULL){ p=q->son[k]; break; } q=q->fail; } if(q==NULL)p=root; } if(p->ar==true)dp[i+1][p->num]=plus(dp[i+1][p->num],dp[i][j]); } } } for(i=1;i<=tot;i++)xzq=plus(xzq,dp[m][i]); } int main() { tot=0; root=new node(); root->num=++tot; ac[tot]=root; scanf("%d%d%d",&n,&m,&t); Read(); for(i=1;i<=len;i++)hash[s[i]]=i; for(i=1;i<=t;i++){ Read(); add(); } Bfs(); Main(); if(xzq.n==0)printf("0\n"); else{ for(i=xzq.n;i>=1;i--)printf("%d",xzq.a[i]); printf("\n"); } }
标签:des style blog color io ar strong for 数据
原文地址:http://www.cnblogs.com/applejxt/p/3956489.html