您的位置:首页 > 其它

Uva-1401-Remember the Word

2013-03-20 19:47 337 查看
参考了下别人的代码,自己的动归没想出来,伤不起。~

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int mod=20071027;
const int maxn=500010;
struct Trie
{
int ch[maxn][30];
int val[maxn];
int sz;
}t;
int dp[maxn],begin,num;
int GetPos(char c)
{
return c-'a';
}
void insert(char *s)
{
int u=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int c=GetPos(s[i]);
if(!t.ch[u][c])
{
memset(t.ch[t.sz],0,sizeof(t.ch[t.sz]));
t.val[t.sz]=0;
t.ch[u][c]=t.sz++;
}
u=t.ch[u][c];
}
t.val[u]=1;
}
void find(char *str)
{
int u=0;
for(int i=0;str[i];i++)
{
int c=GetPos(str[i]);
if(t.ch[u][c])
{
u=t.ch[u][c];
if(t.val[u])
num=(num+dp[begin+i+1])%mod;
}
else
return;
}
}

char str[maxn];
int main()
{
int cas=1;
while(scanf("%s",str)!=EOF)
{
memset(t.ch[0],0,sizeof(t.ch[0]));
t.sz=1;
int s,ans=0;
scanf("%d",&s);
char ita[3001];
while(s--)
{
scanf("%s",ita);
insert(ita);
}
int len=strlen(str);
dp[len]=1;
for(int i=len-1;i>=0;i--)
{
num=0;
begin=i;
find(&str[i]);
dp[i]=num;
}
printf("Case %d: %d\n",cas++,dp[0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: