【POJ】1816 Wild Words
2014-06-28 12:47
337 查看
DFS+字典树。题目数据很BT。注意控制DFS深度小于等于len。当'\0'时,还需判断末尾*。另外,当遇到*时,注意讨论情况。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <algorithm> using namespace std; #define TRIEN 28 typedef struct Trie { vector<int> vc; Trie *next[TRIEN]; Trie() { for (int i=0; i<TRIEN; ++i) next[i] = NULL; } } Trie; Trie root; char buf[25]; int nums[100005], nn, len; void create(char str[], int in) { int i = 0, id; Trie *p = &root, *q; while (str[i]) { if (str[i] == '?') id = 26; else if (str[i] == '*') id = 27; else id = str[i] - 'a'; ++i; if (p->next[id] == NULL) { q = new Trie(); p->next[id] = q; } p = p->next[id]; } p->vc.push_back(in); } void find(Trie *p, int d, int f) { int id; if (d > len) return ; if (buf[d] == '\0') { int vcn = p->vc.size(); int i; if (vcn) { for (i=0; i<vcn; ++i) nums[nn++] = p->vc[i]; } if (p->next[27]) find(p->next[27], d, 0); return ; } id = buf[d] - 'a'; if (p->next[id]) find(p->next[id], d+1, 0); if (p->next[26]) find(p->next[26], d+1, 0); if (p->next[27]) { find(p->next[27], d+1, 1); find(p->next[27], d, 1); } if (f) find(p, d+1, 1); } int main() { int n, m, i; scanf("%d %d", &n, &m); for (i=0; i<n; ++i) { scanf("%s", buf); create(buf, i); } while (m--) { scanf("%s", buf); nn = 0; len = strlen(buf); find(&root, 0, 0); if (!nn) { printf("Not match\n"); continue; } sort(nums, nums+nn); printf("%d", nums[0]); for (i=1; i<nn; ++i) if (nums[i] != nums[i-1]) printf(" %d", nums[i]); printf("\n"); } return 0; }
相关文章推荐
- POJ 1816 Wild Words 笔记
- poj 1816Wild Words(字典树+dfs)
- poj 1816 Wild Words
- POJ 1816 Wild Words
- poj 1816-Wild Words
- POJ 1816 Wild Words
- POJ 1816 Wild Words
- POJ 1816 Wild Words
- [poj] 1816 Wild words
- POJ - 1816 Wild Words(字典树变题)
- POJ 1816 字典树+DFS
- HDU 1816, POJ 2723 Get Luffy Out(2-sat)
- poj 1816(trie+dfs)
- POJ 1816
- POJ 2723 HDU 1816 Get Luffy Out
- POJ - 1816
- poj 1816 Wild Words(字典树+DFS)
- pku 1816 Wild Words
- poj 1816 Trie+DFS匹配模式串
- POJ 1816 Wild Words 字典树+DFS