poj2001

#include <iostream>
#include <string>
#define mx 1001
using namespace std;
struct treenode
{
 char data;//结点信息
 int num;//记录从根到此处,结点出现的次数
 bool color;//从根到此处是否是关键字
 treenode *next[26];
 treenode(char c)//初始化结点
 {
  data=c;
  num=1;
  color=false;
  for(int i=0;i<26;i++)
   next[i]=NULL;
 }
};
void Insert(treenode *root,string str)//插入单词
{
 int i;
 treenode *p=root;
 if(p==NULL)//树为空(可以不要)
 {
  p=new treenode('A');
  root = p;
 }
 for(i=0;i<str.length();i++)
 {
  int data=str[i]-'a';
  if (p->next[data]==NULL)//不存在该结点
  {
   p->next[data]=new treenode(str[i]);
  }
  else//若存在该结点,则它的个数加1
  {
   p->next[data]->num++;
  }
  p=p->next[data];
 }
 p->color=true;
}
void finds(treenode *root,string str)
{
 treenode *p=root;
 char print[21];
 int i,j=0;
 if(p==NULL)//(可以不要)
  return ;
 for (i=0;i<str.length();i++)
 {
  int data=str[i]-'a';
  if (p->next[data]->color==true||p->next[data]->num>1)
   print[j++]=str[i];
  else
  {
   print[j++]=str[i];
   break;
  }
  p=p->next[data];
 }
 print[j]='\0';
 cout<<' '<<print<<endl;
}
int main()
{
 string a,str[mx];
 int i=0,j;
 treenode *root=new treenode('A');
 while(cin>>a)
 {
  str[i++]=a;
  Insert(root,a);
 }
 for (j=0;j<i;j++)
 {
  cout<<str[j];
  finds(root,str[j]);
 }
 return 0;
}

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