您的位置:首页 > 其它

【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: