指针版:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
char str[333333];
struct Node
{
int gaoguo ; struct Node* next[30];
}node[2111111];
const int mod= 20071027;
int len;
Node* newnode()
{
memset(&node[len],0,sizeof(node[len]));
return &node[len++];
}
Node *rt;
void Insert(string s,Node*root)
{
int len2=s.size();
for(int i= 0;i< len2;i++){
int cc=s[i]-'a';
if(!root->next[cc]){
root->next[cc]=newnode();
}
root=root->next[cc];
}
root->gaoguo=1;
}
int ask(string s,Node *root)
{
int len2=s.size();
for(int i=0;i<len2;i++){
int cc=s[i]-'a';
if(root->next[cc])
root=root->next[cc];
else return -1;
}
return root->gaoguo;
}
int len1;
int dp[333333];
char str1[333333];
int main()
{
int n;
int Icase= 0;
while(scanf("%s",str)!=EOF){
memset(dp,0,sizeof(dp));
len1=strlen(str);
scanf("%d",&n);
len=0; rt = newnode();
for(int i=0;i<n;i++){
scanf("%s",str1); Insert(str1,rt);
}
printf("Case %d: ",++Icase);
dp[len1]=1;
for(int i=len1-1;i>=0;i--){
string s="";
for(int j=i;j<len1;j++){
s+=str[j];
int cc=ask(s,rt);if(cc==-1) break;
if(cc==1) dp[i]+=dp[j+1],dp[i]%=mod;
}
}
cout<<dp[0]%mod<<endl;
}
return 0;
}
数组版:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define INF 0xfffffff
#define MOD 20071027
#define MM 400005
#define M 26
struct node
{
int next[M];
int end;
void init()
{
memset(next,-1,sizeof(next));
end=0;
}
}s[MM];
char des[MM];
char str[105];
int tot;
int dp[MM];
void insert()
{
int ind,i,j;
ind=0;
for(i=0;str[i];i++)
{
j=str[i]-'a';
if(s[ind].next[j]==-1)
{
s[tot].init();
s[ind].next[j]=tot++;
}
ind=s[ind].next[j];
}
s[ind].end=1;
}
int main()
{
int n,m,i,j,k;
int cas=0;
while(scanf("%s",des+1)!=EOF)
{
//printf("%s\n",des+1);
s[0].init();
tot=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s",str);
insert();
}
int len=strlen(des+1);
//printf("%d\n",len);
memset(dp,0,sizeof(dp));
dp[0]=1;
for(i=0;i<len;i++)
{
int root=0;
for(j=1;j+i<=len;j++)
{
root=s[root].next[des[i+j]-'a'];
printf("%d %c %d\n",i,des[i+j],root);
if(root==-1) break;
if(s[root].end)
{
dp[i+j]+=dp[i];
printf("%d %d\n",dp[i+j],i+j);
if(dp[i+j]>=MOD) dp[i+j]%=MOD;
}
}
}
printf("Case %d: %d\n",++cas,dp[len]);
}
return 0;
}