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; }
相关文章推荐
- UVA 1401 Remember the Word & LA 3942
- UVA 1401 - Remember the Word(Trie+DP)
- UVA 1401 - Remember the Word(Trie+DP)
- uva 1401 - Remember the Word(字典树+dp)
- uva 1401 Remember the Word(Trie dp)
- UVa 1401 - Remember the Word
- UVa 1401 Remember the Word (字典树, 动归)
- UVA 1401 Remember the Word
- UVA 1401 Remember the Word(用Trie加速动态规划)
- UVA 1401 Remember the Word
- UVa 1401 Remember the Word
- UVa 1401 Remember the Word (Trie树模板题)
- UVA-1401-Remember the Word(Trie)
- UVa 1401 Remember the Word
- UVA 1401 & LA 3942 Remember the Word 字典树+DP
- UVA 1401 Remember the Word
- UVA-1401 - Remember the Word -----Trie前缀树
- UVA-1401 - Remember the Word
- UVa 1401 Remember the Word(Trie+DP)
- uva1401 Remember the Word