您的位置:首页 > 其它

Trie模板 UVALive 3942 Remember the Word

2014-07-04 00:27 302 查看
使用Tire进行DP的递推,f[i+len]+=f[i] 若S[i+1..len]为字典中的元素。

#include <cstdio>
#include <cstring>
#include <queue>

const long long maxnode    = 4010*100;
const long long SIGMA_SIZE = 26;
const long long maxlen     = 100;
const long long maxn       = 300010;
const long long MOD        = 20071027;

using namespace std;

char s[maxn];
int f[maxn];

struct Trie
{
int ch[maxnode][SIGMA_SIZE];
int val[maxnode];
int size;
Trie(){clear();}
void clear(){
size=1;
memset(ch[0],0,sizeof(ch[0]));
memset(val,0,sizeof(val));
}
int index(char t){return t-'a';};
int buildNewNode(int u){
memset(ch[size],0,sizeof(ch[size]));
val[size]=u;
return size++;
}
void insert(char *s){
int u = 0;
for(;*s;s++){
int c = index(*s);
if(!ch[u][c])
ch[u][c]=buildNewNode(0);
u=ch[u][c];
}
val[u]=1;//val[u]=v
}
void find(int i,char *s){
int u=0,len=0;
for(;*s;s++){
int c = index(*s);
if(ch[u][c]){
len++;
u=ch[u][c];
f[i+len]=(val[u]*f[i]+f[i+len])%MOD;
//if(val[u]){find an end }
}
else
break;
}

}
};

Trie trie;

int main()
{
int CaseNum = 0;
while(scanf("%s",s)!=EOF){
int n,len=strlen(s);
memset(f,0,sizeof(f));f[0]=1;
trie.clear();

scanf("%d",&n);
for(int i=0;i<n;i++){
char key[110];
scanf("%s",key);
trie.insert(key);
}

for(int i=1;i<=len;i++)
trie.find(i-1,s+i-1);

printf("Case %d: %d\n",++CaseNum,f[len]);

}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: