poj 1035 Spell checker trie树+快排

来源:互联网 发布:双色球数据库分析 编辑:程序博客网 时间:2024/05/27 10:43

很恶心的一道题。。。

思想很简单的,就是找一个单词是否在字典中出现过,出现了则按题意输出。如果没出现,则在某个位置插入或删除或替代某个字符,然后判断在字典中是否出现。

我用的字典树,还没用STL里的map尝试,代码量会稍大些。

有几个恶心的地方:输出时按在字典中出现的顺序输出,即删除或插入或替代操作后有多个答案时按input里单词的输入先后顺序依次输出;插入时注意可以往单词末尾插入;注意判重,去掉可能的相同单词的情况。。。

这题还是借鉴discuss里的方法敲出来的,相似度也有点高。囧。。。



/*Memory: 13728KTime: 79MSLanguage: 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;}