poj 1035 Spell checker trie树+快排
2012-09-13 22:57
447 查看
很恶心的一道题。。。
思想很简单的,就是找一个单词是否在字典中出现过,出现了则按题意输出。如果没出现,则在某个位置插入或删除或替代某个字符,然后判断在字典中是否出现。
我用的字典树,还没用STL里的map尝试,代码量会稍大些。
有几个恶心的地方:输出时按在字典中出现的顺序输出,即删除或插入或替代操作后有多个答案时按input里单词的输入先后顺序依次输出;插入时注意可以往单词末尾插入;注意判重,去掉可能的相同单词的情况。。。
这题还是借鉴discuss里的方法敲出来的,相似度也有点高。囧。。。
思想很简单的,就是找一个单词是否在字典中出现过,出现了则按题意输出。如果没出现,则在某个位置插入或删除或替代某个字符,然后判断在字典中是否出现。
我用的字典树,还没用STL里的map尝试,代码量会稍大些。
有几个恶心的地方:输出时按在字典中出现的顺序输出,即删除或插入或替代操作后有多个答案时按input里单词的输入先后顺序依次输出;插入时注意可以往单词末尾插入;注意判重,去掉可能的相同单词的情况。。。
这题还是借鉴discuss里的方法敲出来的,相似度也有点高。囧。。。
/*Memory: 13728K Time: 79MS Language: C++ Result: Accepted */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node{ //记录结果 char str[20]; int index; }ans[10010]; struct Trie{ Trie *br[26]; int index; void init(){ index=0; for(int i=0;i<26;++i) br[i]=NULL; } }*root,tree[150010]; int p; void build(char *s,int idx) { Trie *t=root; for(int i=0;s[i];++i){ int id=s[i]-'a'; if(!t->br[id]){ tree[++p].init(); t->br[id]=&tree[p]; } t=t->br[id]; } t->index=idx; //记录单词是第几个输入的 } int search(char *s) { Trie *t=root; for(int i=0;s[i];++i){ int id=s[i]-'a'; if(!t->br[id]) return 0; t=t->br[id]; } return t->index; } void repla(char *from,char *to,int pos,char c) { //替代某个字符 strcpy(to,from); to[pos]=c; } void insert(char *from,char *to,int pos,char c) { //插入某个字符 int len=strlen(from); for(int i=0;i<pos;++i) to[i]=from[i]; to[pos]=c; for(int i=pos;i<len;++i) to[i+1]=from[i]; to[len+1]='\0'; } void delet(char *from,char *to,int pos) { //删除某个字符 int len=strlen(from); for(int i=0;i<pos;++i) to[i]=from[i]; for(int i=pos;i<len-1;++i) to[i]=from[i+1]; to[len-1]='\0'; } int cmp(const node &a,const node &b) { return a.index<b.index; } int main() { tree[0].init(); root=&tree[0]; char str[20],temp[20]; int idx=1; while(scanf("%s",str),str[0]!='#'){ build(str,idx++); } while(scanf("%s",str),str[0]!='#'){ if(search(str)) printf("%s is correct\n",str); else{ int len=strlen(str); int x,cnt=0; for(int i=0;i<len;++i){ delet(str,temp,i); if((x=search(temp))!=0){ strcpy(ans[cnt].str,temp); ans[cnt++].index=x; } for(int j=0;j<26;++j){ repla(str,temp,i,j+'a'); if((x=search(temp))!=0){ strcpy(ans[cnt].str,temp); ans[cnt++].index=x; } insert(str,temp,i,j+'a'); if((x=search(temp))!=0){ strcpy(ans[cnt].str,temp); ans[cnt++].index=x; } } } for(int i=0;i<26;++i){ insert(str,temp,len,i+'a'); if((x=search(temp))!=0){ strcpy(ans[cnt].str,temp); ans[cnt++].index=x; } } sort(ans,ans+cnt,cmp);//排序,保证结果按输入顺序输出 printf("%s:",str); if(cnt) printf(" %s",ans[0].str); for(int i=1;i<cnt;++i) //判重 if(ans[i].index!=ans[i-1].index) printf(" %s",ans[i].str); puts(""); } } return 0; }
相关文章推荐
- POJ 1035 Spell checker (trie树)
- poj 1035 Spell checker(水题)
- POJ 1035 Spell checker 查找单词
- POJ训练计划1035_Spell checker(串处理/暴力)
- Spell checker - poj 1035 (hash)
- POJ 1035 Spell checker(字符串比较)
- POJ 1035 Spell checker(水~)
- POJ训练计划1035_Spell checker(串处理/暴力)
- POJ 1035 Spell checker【字符串暴力处理】
- poj 1035--Spell checker
- POJ 1035-Spell checker(字符串)
- Spell checker POJ 1035 字符串
- 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 字符串 难度:0