【POJ】1035 Spell checker
2014-06-27 17:18
197 查看
字典树。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <string> using namespace std; typedef struct Trie { int in; Trie *next[26]; } Trie; Trie root; char map[10005][25]; int nums[205], nn; void create(char str[], int in) { int i = 0, j, id; Trie *p = &root, *q; while (str[i]) { id = str[i] - 'a'; ++i; if (p->next[id] == NULL) { q = (Trie *)malloc(sizeof(Trie)); q->in = -1; for (j=0; j<26; ++j) q->next[j] = NULL; p->next[id] = q; } p = p->next[id]; } p->in = in; } int find(char str[], int x) { int i = 0, id; Trie *p = &root; while (str[i]) { if (i == x) { ++i; continue; } id = str[i] - 'a'; ++i; if (p->next[id] == NULL) return -1; p = p->next[id]; } return p->in; } void ffind(char str[]) { int len = strlen(str), i, j, k; char ch, bk, bf[25]; nn = 0; for (i=0; i<=len; ++i) bf[i] = str[i]; for (i=0; i<len; ++i) { bk = bf[i]; for (ch='a'; ch<='z'; ++ch) { if (ch == bk) continue; bf[i] = ch; j = find(bf, -1); if (j != -1) nums[nn++] = j; } bf[i] = bk; } for (i=0; i<len; ++i) { j = find(bf, i); if (j != -1) nums[nn++] = j; } bf[len+1] = '\0'; for (i=0; i<=len; ++i) { k = j = 0; while (j<len) { if (k != i) { bf[k] = str[j]; ++j; } ++k; } for (ch='a'; ch<='z'; ++ch) { bf[i] = ch; j = find(bf, -1); if (j != -1) nums[nn++] = j; } } } int comp(const void *a, const void *b) { return *(int *)a - *(int *)b; } int main() { int n = 0, f; char buf[25]; for (int i=0; i<26; ++i) root.next[i] = NULL; while (scanf("%s", map )!=EOF && map [0]!='#') { create(map , n); ++n; } while (scanf("%s", buf)!=EOF && buf[0]!='#') { f = find(buf, -1); if (f != -1) { printf("%s is correct\n", buf); continue; } ffind(buf); printf("%s:", buf); if (nn) { qsort(nums, nn, sizeof(int), comp); for (int i = 0; i<nn; ++i) { if (i && nums[i] == nums[i-1]) continue; printf(" %s", map[nums[i]]); } } printf("\n"); } return 0; }
相关文章推荐
- POJ 1035 Spell checker
- POJ 1035 Spell checker
- day4 POJ 1035 Spell checker
- poj1035——Spell checker
- POJ 1035:Spell checker
- poj 1035 Spell checker
- poj 1035 Spell checker
- poj1035 Spell checker
- POJ 1035 Spell checker
- poj-1035-Spell checker
- poj 1035 Spell checker
- Poj 1035 --Spell checker
- POJ1035——spell checker
- POJ 一 1035 Spell checker
- poj1035 Spell checker
- poj 1035 Spell checker
- POJ 1035 Spell checker
- poj1035 Spell checker
- poj1035_Spell checker
- POJ 1035 Spell checker