很恶心的一道题。。。
思想很简单的,就是找一个单词是否在字典中出现过,出现了则按题意输出。如果没出现,则在某个位置插入或删除或替代某个字符,然后判断在字典中是否出现。
我用的字典树,还没用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;
}