la 3942 Rember_前缀树

来源:互联网 发布:办公软件相关书籍 编辑:程序博客网 时间:2024/06/06 20:19
#include <iostream>#include<cstdio>#include<cstring>using namespace std; #define N 400010/* run this program using the console pauser or add your own getch, system("pause") or input loop */int ch[N][30];int val[N];int cnt;char str[N];int d[N];int idx(int c){return c-'a';}void insert(char *s){int i,n=strlen(s);int c,u=0;for(i=0;i<n;i++){c=idx(s[i]);if(!ch[u][c]){memset(ch[cnt],0,sizeof(ch[cnt]));val[cnt]=0;ch[u][c]=cnt++;}u=ch[u][c];}val[u]=n;}void search(char *s,int i,int len){int j;int c,u=0;for(j=0;j<len;j++){c=idx(s[j]);if(!ch[u][c])break;u=ch[u][c];if(val[u])d[i]=(d[i]+d[i+val[u]])%20071027;}}int main(int argc, char** argv) {int num=1;int n,i,k;char s[N];while(scanf("%s",str)!=EOF){cnt=1;val[0]=0;memset(ch[0],0,sizeof(ch[0]));n=strlen(str);scanf("%d",&k);while(k--){scanf("%s",s);insert(s);}memset(d,0,sizeof(d));d[n]=1;for(i=n-1;i>=0;i--)search(str+i,i,n-i);printf("Case %d: %d\n",num++,d[0]);}return 0;}

原创粉丝点击