#include <iostream>
#include<stdio.h>
#include<cstdlib>
#include<string>
#include<string.h>
using namespace std;
const int maxnum=27;
const int mod=20071027;
const int maxnode=500005;
int dp[maxnode];
struct trie
{
int ch[maxnode][maxnum];
int val[maxnode];
int sz;
void init()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
int idx(char c)
{
return c-'a';
}
void insert(char *word,int v)
{
int u=0,n=strlen(word),i;
for(i=0;i<n;i++)
{
int c=idx(word[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;
}
int query(char *word,int start)
{
int u=0,n=strlen(word),i;
int ret=0;
for(i=start;i<n;i++)
{
int c=idx(word[i]);
if(ch[u][c]==0)
return ret;
u=ch[u][c];
if(val[u])
{
ret+=dp[i+1];
ret%=mod;
}
}
return ret;
}
}root;
int main()
{
char s[maxnode];
int cas=1;
while(scanf("%s",s)!=EOF)
{
root.init();
memset(dp,0,sizeof(dp));
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
char word[105];
//cout<<"haha"<<endl;
scanf("%s",word);
root.insert(word,1);
}
int k=strlen(s);
dp[k]=1;
//cout<<k<<endl;
for(i=1;i<=k;i++)
{
dp[k-i]=root.query(s,k-i);
}
//for(i=0;i<k;i++)
// cout<<dp[i]<<" ";
printf("Case %d: ",cas++);
printf("%d\n",dp[0]);
}
}
UVA3942(字典树加DP)
最新推荐文章于 2019-03-21 17:56:00 发布