POJ 1035 Spell checker
2012-11-17 01:20
579 查看
trie树做的,看discuss说,暴力貌似可以。
主要trick就是匹配到的字符串可能重复,要注意去重
主要trick就是匹配到的字符串可能重复,要注意去重
#include <iostream> #include <cstdio> #include <cstring> #include <map> #include <algorithm> using namespace std; #define MAX 300000 struct node { int flag; int tag; int next[26]; int init() { memset(next,-1,sizeof(next)); flag=0; tag=0; return 0; } }trie[MAX]; struct asdf { char s[20]; }; int size; const int root=0; int val(char a) { return a-'a'; } map<string,int> mp; int lm,ls; struct textmem { char s[20]; }; textmem lstr[10000]; int insert(char *s) { int i,p=root; for (i=0; s[i]; i++) { int v=val(s[i]); if (trie[p].next[v] == -1) { trie[p].next[v]=size; trie[size].init(); size++; } p=trie[p].next[v]; } trie[p].tag=1; return 0; } int match(char *s) { int p=root,i; for (i=0; s[i]; i++) { int v=val(s[i]); p=trie[p].next[v]; if (p == -1) break; if (trie[p].tag && s[i+1] == '\0') return 1; } return 0; } void deleteLetter(char *str) { char t[20]; int i,j,k; for (i=0; str[i]; i++) { for (j=0,k=0; str[k]; j++,k++) { if (k == i) { j--; continue; } t[j]=str[k]; } t[j]='\0'; if (match(t)) { strcpy(lstr[ls].s,t); ls++; } } } void replaceLetter(char *str) { int i,j,k; char t[20]; for (i=0; str[i]; i++) { for (j=0; j<26; j++) { for (k=0; str[k]; k++) { if (k == i) t[k]='a'+j; else t[k]=str[k]; } t[k]='\0'; if (match(t)) { strcpy(lstr[ls].s,t); ls++; } } } } void insertLetter(char *str) { int i,j,k,s,lt; char t[20]; s=strlen(str); for (i=0; i<=s; i++) { for (j=0; j<26; j++) { lt=0; for (k=0; str[k]; k++) { if (k == i) { t[lt]=j+'a'; lt++; t[lt]=str[k]; lt++; } else { t[lt]=str[k]; lt++; } } if (i == s) { t[lt]=j+'a'; lt++; } t[lt]='\0'; if (match(t)) { strcpy(lstr[ls].s,t); ls++; } } } } bool cmp(textmem a,textmem b) { return mp[a.s] < mp[b.s]; } int main() { int i,n,j; char str[20]; lm=0; mp.clear(); for (i=0; i<MAX; i++) { trie[i].init(); } size=1; while (1) { scanf("%s",str); if (str[0] == '#') break; insert(str); mp[str]=lm; lm++; } while (1) { scanf("%s",str); if (str[0] == '#') break; if (match(str)) { printf("%s is correct\n",str); continue; } ls=0; deleteLetter(str); replaceLetter(str); insertLetter(str); sort(lstr,lstr+ls,cmp); printf("%s:",str); for (i=0; i<ls; i++) { if (i == 0 || strcmp(lstr[i-1].s,lstr[i].s) != 0) printf(" %s",lstr[i].s); } printf("\n"); } }
相关文章推荐
- POJ 1035 Spell checker
- 【POJ 1035】Spell checker
- Spell checker--POJ 1035
- POJ1035 Spell checker
- POJ1035--Spell checker--Tire
- poj1035--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
- poj 1035 Spell checker
- poj 1035 Spell checker
- poj 1035 Spell checker
- POJ 1035 Spell checker
- POJ 1035, Spell checker
- POJ 1035 Spell checker
- POJ 1035 Spell checker