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;
}

posted @ 2011-09-19 20:21  qijinbiao1  阅读(171)  评论(0编辑  收藏  举报