hdu 1075 What Are You Talking About (字典树)

初学字典树

此题涉及建立Trie tree和查找操作,只是输入有些复杂。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
 struct node *child[26];
 char *str;
}*root;
void insert(char *c1,char *c2)
{
 int len=strlen(c2);
 struct node *cur,*newnode;
 cur=root;
 for(int i=0;i<len;i++)
 {
  if(cur->child[c2[i]-'a']!=0)	//如果此处与前字符串有相同的关键字,那么跳到此关键字的孩子节点继续操作 
        cur=cur->child[c2[i]-'a'];
  else
  {
   newnode=new struct node;
   cur->child[c2[i]-'a']=newnode;
   for(int j=0;j<26;j++)
          newnode->child[j]=0;
   newnode->str=NULL;
   cur=newnode;      
  }     
 }
 cur->str=new char[15];	//为一个字符串建立对应位置后,将对应的译文放入str中。 
 strcpy(cur->str,c1);
}
void find_print(char *c2)
{
 int len=strlen(c2);
 struct node *cur;
 cur=root;
 if(!len) return ;
 for(int i=0;i<len;i++)
 {
  		if(c2[i]<'a'||c2[i]>'z'||cur->child[c2[i]-'a']==0)
        {
          printf("%s",c2);
          return ;
        }
        else cur=cur->child[c2[i]-'a'];             
 }
 if(cur->str!=NULL)//如果找到了,且相应节点上存放着字符串,则输出,即所查找的单词不是前缀
       printf("%s",cur->str);
 else printf("%s",c2);    
}
int main()
{
 char s[15],temp[3005],c1[15],c2[15];
 root=new struct node;
 for(int i=0;i<26;i++)
         root->child[i]=0;
     scanf("%s",temp);
  while(scanf("%s",c1)&&strcmp(c1,"END")!=0)
  {
   scanf("%s",c2);
   insert(c1,c2);
  }   
  scanf("%s",temp);
  getchar();
  while(gets(temp)&&strcmp(temp,"END")!=0)
  {
   int len=strlen(temp);
   int num=0;
   bool flag=false;
   for(int i=0;i<len;i++)
   {
	    if(temp[i]>='a'&&temp[i]<='z')
	    {
	      		   if(flag==false)
	                     flag=true;
	               s[num++]=temp[i];     
	    }
	    else
	    {
	       	if(flag)
	    	{
	            flag=false;
	        	s[num]='\0';
	            num=0;
	            find_print(s);
	    	}
	    	printf("%c",temp[i]);
	   	}
    }
    if(flag)
    {
         s[num]='\0';
         find_print(s);
  	}
  printf("\n"); 
  }
  return 0;
}

你可能感兴趣的:(hdu 1075 What Are You Talking About (字典树))