您的位置:首页 > 其它

poj 1035 Spell checker trie树+快排

2012-09-13 22:57 447 查看
很恶心的一道题。。。

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

我用的字典树,还没用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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: