训练指南 P209 例题
用trie树使得每次寻找递推的下一步。
#include <iostream>
#include <cstdio>
#include <cstring>
#define MOD 20071027
using namespace std;
struct Trie
{
bool tag;
int next[26];
bool init()
{
tag=false;
memset(next,-1,sizeof(next));
}
};
Trie tree[550000];
int lt;
void init()
{
int i;
lt=1;
tree[0].init();
}
void insert(char *word)
{
int t,i,val;
t=0;
i=0;
while (word[i] != '\0')
{
val=word[i]-'a';
if (tree[t].next[val] == -1)
{
tree[t].next[val]=lt;
tree[lt].init();
if (word[i+1] == '\0')
tree[lt].tag=true;
//printf("%d %d %d %d %c\n",t,val,lt,tree[lt].tag,word[i]);
t=lt;
lt++;
}
else
{
t=tree[t].next[val];
if (word[i+1] == '\0')
tree[t].tag=true;
}
i++;
}
}
char tar[320000];
int d[320000];
int main()
{
char ts[120];
int n,i,k,lts,t,len,j,p;
k=1;
while (scanf("%s",tar) != EOF)
{
lts=strlen(tar);
init();
scanf("%d",&n);
getchar();
for (i=0; i<n; i++)
{
scanf("%s",ts);
insert(ts);
}
memset(d,0,sizeof(d));
for (i=0; i<lts; i++)
{
p=0;
for (j=i; tar[j] != '\0'; j++)
{
t=tar[j]-'a';
if (tree[p].next[t] == -1)
break;
p=tree[p].next[t];
if (tree[p].tag == true)
{
if (i-1 != -1)
d[j]+=d[i-1];
else
d[j]++;
d[j]%=MOD;
}
}
/* len=0;
j=i;
p=0;
while (tar[j] != '\0')
{
t=tar[j]-'a';
len++;
// printf("%c %d %d\n",tar[j],p,tree[p].tag);
if (tree[p].next[t] == -1)
break;
p=tree[p].next[t];
//printf("%c %d %d\n",tar[j],p,tree[p].tag);
if (tree[p].tag == true)
{
d[i]+=d[i+len];
d[i]%=20071027;
}
j++;
}*/
}
printf("Case %d: %d\n",k,d[lts-1]%MOD);
k++;
}
}