wa到我吐血。。后来发现是把1027写成1207了 我真想抽死我自己。。
一开始dp写的是递归 然后指针一直有bug。。受不了 一想这么写出来也得T。。因为有重复计算,再说递归本来就慢。
后来就改成从前往后迭代相加的 本来是对的。。但是因为写错了mod 一直wa 后来又改成静态字典树。。wa了11次。。
建字典树 然后用dp[i]表示以i结尾的字符串有多少种构造方法了。
dp就行了
先写动态字典树的。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
struct Node
{
Node * child[26];
bool flag;
Node()
{
for(int i=0;i<26;++i)
child[i]=NULL;
flag=false;
}
};
const int MOD=20071027;
const int maxn=300005;
char str[maxn],word[105];
int n,len,dp[maxn];
Node *root,*p;
void insert()
{
p=root;
int i,word_len=strlen(word);
for(i=0;i<word_len;++i)
{
if(p->child[word[i]-'a']==NULL)
{
p->child[word[i]-'a']=new Node();
}
p=p->child[word[i]-'a'];
}
p->flag=true;
}
void dp_work()
{
memset(dp,0,sizeof(dp));
int i,j;
dp[0]=1;
str[0]=1;
for(i=0;str[i];++i)
{
p=root;
for(j=1;str[i+j];++j)
{
p=p->child[ str[i+j]-'a' ];
if(p==NULL) break;
else
{
if(p->flag)
{
dp[i+j]+=dp[i];
dp[i+j]=dp[i+j]%MOD;
}
}
}
}
}
int main()
{
int i,j,ca=1;
while(scanf("%s",str+1)!=EOF)
{
len=strlen(str+1);
root = new Node();
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%s",word);
insert();
}
dp_work();
printf("Case %d: %d\n",ca++,dp[len]);
}
return 0;
}
然后是静态字典树的 第一次写静态的。。#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MOD=20071027;
const int maxn=310000;
char str[maxn],word[110];
int dp[maxn];
struct Node
{
int next[26];
int flag;
}T[4000*100];
int tot;
void insert()
{
int root=0;
for(int i=0;word[i];++i)
{
if(T[root].next[word[i]-'a']==-1)
{
T[root].next[word[i]-'a'] = tot++;
}
root=T[root].next[word[i]-'a'];
}
T[root].flag=1;
}
int main()
{
int n,ca=1;
while(scanf("%s",str+1)!=EOF)
{
scanf("%d",&n);
memset(T,-1,sizeof(T));
tot=1;
while(n--)
{
scanf("%s",word);
insert();
}
memset(dp,0,sizeof(dp));
int len=strlen(str+1);
dp[0]=1;
str[0]=1;
for(int i=0;str[i];++i)
{
int root=0;
for(int j=1;str[i+j];++j)
{
root=T[root].next[str[i+j]-'a'];
if(root==-1)
break;
else
{
if(T[root].flag==1)
{
dp[i+j]+=dp[i];
while(dp[i+j]>MOD) dp[i+j]-=MOD;
}
}
}
}
printf("Case %d: %d\n",ca++,dp[len]);
}
return 0;
}