uva 1401 - Remember the Word(字典树)
2013-09-20 12:28
281 查看
题意:给一个长串(长度1~300000),s(1~4000)个单词,问长串可以完全分解成单词的方案种数?
解析:先保存单词前缀,然后将长串严格从左往右枚举以i位置为首的前缀数,注意剪枝(不重复),一次搜索后的结尾位置的后一个位置作为下次搜索的起始位置(进入优先队列,保证严格从左往右搜索)dp【i】表示以i位置为结尾的方案数,则dp【i】+=dp【w-1】;w为本次搜索的初始位置,一次循环就可以得到答案,
解析:先保存单词前缀,然后将长串严格从左往右枚举以i位置为首的前缀数,注意剪枝(不重复),一次搜索后的结尾位置的后一个位置作为下次搜索的起始位置(进入优先队列,保证严格从左往右搜索)dp【i】表示以i位置为结尾的方案数,则dp【i】+=dp【w-1】;w为本次搜索的初始位置,一次循环就可以得到答案,
#include<iostream> #include<cstdio> #include<string.h> #include<functional> #include<queue> #include<vector> #include<algorithm> using namespace std; #define N 300005 #define mod 20071027 typedef long long LL; char s ; int n,len,dp ,vis ,res; priority_queue<int, vector<int>, greater<int> > sea; struct node { int prefix; bool isword; node *next[27]; node() { prefix=0; isword=false; memset(next,NULL,sizeof(next)); } } *root; void insert(char *a) { node *p=root; for(int i=0; a[i]; i++) { int x=a[i]-'a'; if(p->next[x]==NULL) p->next[x]=new node; p=p->next[x]; } p->isword=true; p->prefix++; } void search(int w) { node *p=root; // if(w==len) { res++; if(res>mod) res=res-mod; return; } for(int i=w; i<len; i++) { int x=s[i]-'a'; if(p->next[x]==NULL) break; p=p->next[x]; if(p->isword) { dp[i]+=dp[w-1]; if(dp[i] >= 20071027) dp[i] %= 20071027; if(!vis[i+1]) { vis[i+1]=1; sea.push(i+1); } } } while(!sea.empty()) { int t=sea.top();//优先队列保证严格从左往右搜索 sea.pop(); search(t); } } int main() { int i,j,t=1; char a[105]; while(~scanf("%s",s+1)) { scanf("%d",&n); s[0]='!'; res=0; len=strlen(s); root=new node; for(i=0; i<n; i++) { scanf("%s",&a); insert(a); } memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); dp[0]=1; vis[1]=1; search(1); printf("Case %d: %d\n",t++,dp[len-1]%mod); free(root); } return 0; }
相关文章推荐
- UVA 1401 Remember the Word(字典树)
- UVA 1401 Remember the Word(字典树)
- UVa 1401 Remember the Word (字典树, 动归)
- Uva 1401 Remember the Word 字典树+DP
- uva 1401 - Remember the Word(字典树+dp)
- UVa:1401 Remember the Word(字典树)
- UVA 1401 & LA 3942 Remember the Word 字典树+DP
- UVA-1401 - Remember the Word
- UVA 1401 Remember the Word
- uva 1401 && Live Archive 3942 Remember the Word
- UVa 1401 - Remember the Word(Trie + DP)
- UVa 1401 Remember the Word (Trie树模板题)
- UVALive 3942 Remember the Word(字典树 + 简单dp)
- UVA 1401 Remember the Word(Trie树 套 DP)
- 【Uvalive3942】Remember the Word——字典树+dp
- Uva-1401-Remember the Word
- uva 1401 Remember the Word ( Trie + DP )
- UVA 1401 Remember the Word
- UVa 1401 Remember the Word
- uva 1401 - Remember the Word(DP+Tire树,5级)