uvalive3942(前缀树)
2015-03-30 19:43
197 查看
题意:
给出一个字符串,然后给出n个单词,问这个串分解成单词,有几种分法;
思路:
用Trie树;
给出一个字符串,然后给出n个单词,问这个串分解成单词,有几种分法;
思路:
用Trie树;
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int N = 300000 + 5; const int MOD = 20071027; char s ; int val , ch [30], sz, dp ; void Insert(char *str) { int u = 0, n = strlen(str); for (int i = 0; i < n; i++) { int c = str[i] - 'a'; if (ch[u][c] == 0) { memset(ch[sz], 0, sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u] = 1; } int main() { int n, cas = 1; while (scanf("%s", s) == 1) { memset(dp, 0, sizeof(dp)); sz = 1; memset(ch[0], 0, sizeof(ch[0])); scanf("%d", &n); char str[200]; for(int i = 0; i < n; i++) { scanf("%s", str); Insert(str); } int len = strlen(s); int sum = 0; dp[len] = 1; for (int i = len - 1; i >= 0; i--) { int u = 0, l = len - i; for (int j = 0; j < l; ++j) { if (s[i + j] == 0) break; int c = s[i + j] - 'a'; if (ch[u][c] == 0) break; u = ch[u][c]; if (val[u]) dp[i] = (dp[i] + dp[i + j + 1]) % MOD; } } printf("Case %d: %d\n",cas++ ,dp[0]); } return 0; }
相关文章推荐
- UVALive 3942 Remember the Word 前缀树Trie
- UVALive - 3942(前缀树DP)
- UVALive 3942 字典树+dp
- UVALive 3942 字典树+dp
- [UVALive3942] Remember the Word && 字符串
- uvalive3942 Remember the Word
- UVALive 3942 - Remember the Word(DP,数组Trie+指针Trie)
- uvaLive 3942 Remember the Word 字典树
- UVALive - 3942 Remember the Word(trie + dp)
- UVALive 3942 (LA 3492) Remember the Word Trie树 + 记忆化搜索
- UVALive - 3942 Remember the Word (dp+字典树)
- UVALive 3942 Remember the Word(字典树 + 简单dp)
- UVALive 3942 Remember the Word(trie + dp)
- 【Uvalive3942】Remember the Word——字典树+dp
- UVALive 3942 Remember the Word(字典树+dp)
- uva 1401 && Live Archive 3942 Remember the Word
- (trie)UVALive - 3942 Remember the Word
- UVALive - 3942 Remember the Word
- uvalive 3942 Remember the Word 字典树+dp
- Remember the Word - UVaLive 3942 Trie树+dp