Tire 字典树&& uva1401
2014-07-09 00:31
99 查看
题意:给一个长字符串s(1<|s|<300000),和n(n<4000)个单词,求出有多少种把s分成单词的方法(白书P209)。
打模板!
打模板!
#include<cstdio> #include<cstring> #define MOD 20071027 #define maxnode 4010*101 #define MAXLEN 300005 #define sigema_size 26 int ca=0,S,d[MAXLEN]; char str[MAXLEN],tmp[105]; struct Trie { int sz; int ch[maxnode][sigema_size]; int val[maxnode]; void init() {sz=1;memset(ch,0,sizeof(ch));memset(val,0,sizeof(val));} int idx(char c) {return c-'a';} void insert(char *s) { int u=0; for(int i=0;s[i];++i) { int c=idx(s[i]); if(!ch[u][c]) { memset(ch[sz],0,sizeof(ch[c])); ch[u][c]=sz++; } u=ch[u][c]; } val[u]=1; } int find(char *s,int a) { int u=0,ans=0; for(int i=a;s[i];++i) { int c=idx(s[i]); if(!ch[u][c]) return ans; u=ch[u][c]; if(val[u]) ans=(ans+d[i+1])%MOD; } return ans; } }trie; void solve() { int n=strlen(str); d =1; for(int i=n-1;i>=0;--i) d[i]=trie.find(str,i); printf("Case %d: %d\n",++ca,d[0]); } int main() { while(~scanf("%s",&str)) { trie.init(); scanf("%d",&S); for(int i=0;i<S;++i){scanf("%s",tmp);trie.insert(tmp);} solve(); } return 0; }
相关文章推荐
- UVA 11732 —— 左儿子右兄弟表示法&&Tire
- uva 1401 && Live Archive 3942 Remember the Word
- UVA 1401 Remember the Word & LA 3942
- UVa 12333 - Revenge of Fibonacci <大数 字典树>
- uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401
- LA 3942 && UVa 1401 Remember the Word (Trie + DP)
- UVA 1401 & LA 3942 (字典树Trie+递推)
- UVA 1401 & LA 3942 Remember the Word 字典树+DP
- uva 10815 Andy's First Dictionary
- 【图染色】POJ 1419 & UVA 193
- uva 10817 Headmaster's Headache
- UVa 10010 - Where's Waldorf?
- uva10010 - Where's Waldorf?
- UVA 10451 Ancient Village Sports && UVA 11909 Soya Milk && UVA 11152 Colourful Flowers
- uva-10010 - Where's Waldorf?
- uva 10404 Bachet's Game
- uva 639 - Don't Get Rooked
- UVa 10404. Bachet's Game
- uva 11424 GCD Extreme 求∑∑gcd(i,j) (1<i<n,i<j<n)
- 经典的Nim游戏 博弈经典模型 UVa 10404 - Bachet's Game