题意:给你一个长的字符串,然后给你一堆短的字符串,问你用那一堆小的字符串有多少种方式组合成长的字符串
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
char ch[300009],s[105];
int f[400090][30],a[4000090],n;
int main()
{
int cas=0;
while(~scanf("%s",ch))
{
memset(f[0],0,sizeof f[0]);
int sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
int len=strlen(s),k=0;
for(int j=0;j<len;j++)
{
int x=s[j]-'a'+1;
if(!f[k][x])
{
f[k][x]=++sum;
memset(f[sum],0,sizeof f[sum]);
}
k=f[k][x];
}
f[k][0]=1;
}
int len=strlen(ch);
memset(a,0,sizeof a);
a[0]=1;
for(int i=0;i<len;i++)
{
int k=0,j=0;
while(i+k<len&&f[j][ch[i+k]-'a'+1])
{
j=f[j][ch[i+k]-'a'+1];
k++;
if(f[j][0]) a[i+k]=(a[i+k]+a[i])%20071027;
}
}
printf("Case %d: %d\n",++cas,a[len]);
}
return 0;
}