poj1035
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
struct treenode
{
bool color;
int num;
treenode *next[26];
treenode()
{
color=false;
memset(next,NULL,sizeof(next));
}
};
struct ansers
{
int num;
string strs;
};
treenode tri[200001];
bool cmp(ansers a,ansers b)
{
if(a.num>b.num)
return false;
else
return true;
}
void finds(treenode *root,string str)
{
ansers anser[20001];
int ii=0,i,j,k;string str1;
treenode *p=root;
for(i=0;i<str.length();i++)
{
int data=str[i]-'a';
if(p->next[data]!=NULL)
p=p->next[data];
else
break;
}
if(p->color==true&&i==str.length())//相等
cout<<str<<" is correct"<<endl;
else
{ bool flg=true;
for (j=0;j<str.length();j++)//字符数相等
{
str1=str;
for(k=0;k<26;k++)
{
str1[j]='a'+k;
p=root;
for(i=0;i<str1.length();i++)
{
int data=str1[i]-'a';
if(p->next[data]!=NULL)
p=p->next[data];
else
break;
}
if(p->color==true&&i==str1.length())
{
anser[ii].strs=str1;
anser[ii++].num=p->num;
}
}
}
for(j=0;j<=str.length();j++)//要查的str少一个字符
{
for(k=0;k<26;k++)
{
char ss='a'+k;
str1=str.substr(0,j)+ss+str.substr(j,str.length()-j);
p=root;
for(i=0;i<str1.length();i++)
{
int data=str1[i]-'a';
if(p->next[data]!=NULL)
p=p->next[data];
else
break;
}
if(p->color==true&&i==str1.length())
{
anser[ii].strs=str1;
anser[ii++].num=p->num;
}
}
}
if(str.length()>1)
for(j=0;j<str.length();j++)//要查的str多一个字符
{
str1=str.substr(0,j)+str.substr(j+1,str.length()-j);
p=root;
for(i=0;i<str1.length();i++)
{
int data=str1[i]-'a';
if(p->next[data]!=NULL)
p=p->next[data];
else
break;
}
if(p->color==true&&i==str1.length())
{
anser[ii].strs=str1;
anser[ii++].num=p->num;
}
}
sort(anser,anser+ii,cmp);
cout<<str<<": ";
if(ii>1)
{
cout<<anser[0].strs<<' ';
for(i=1;i<ii;i++)
if(anser[i-1].strs!=anser[i].strs)
cout<<anser[i].strs<<' ';
}
if(ii==1)
cout<<anser[0].strs;
cout<<endl;
}
}
int ss=0,num=0;
void Insert(treenode *root,string str)
{
treenode *p=root;
for(int i=0;i<str.length();i++)
{
int data=str[i]-'a';
if(p->next[data]==NULL)
p->next[data]=&tri[++ss];
p=p->next[data];
}
p->color=true;
p->num=num;
num++;
}
int main()
{
string str;char a[15];
treenode *root=&tri[0];
while(scanf("%s",a))
{
str=a;
if(str=="#")
break;
else
Insert(root,str);
}
while(cin>>str&&str!="#")
{
finds(root,str);
}
return 0;
}