hdu 1075 What Are You Talking About(Trie树)
水平太弱了,这道题里面学到很多
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075
//巩固了字符串中'\0'的使用,strlen只求\0前面的串的长度,cout只输出\0前面的串,所以利用\0本质上可以实现字符串的清空操作 #include<iostream> #include<cstring> using namespace std; struct node{//用trie来存储火星文 bool val; node* ch[26]; char word[11]; node(){ for(int i=0;i<26;i++) ch[i]=NULL; val=0; } }; node *root=new node,*p; char str[3002]; char str1[11],str2[11],buf[11];//我们从字符串中找出单词,存在buf中,但要注意,要想输出单词,必须在数组结尾加'\0'!!!!!!!! int idx( char x ){ return x-'a'; } void insert(char* str1,char* str2){//str1为英语,str2为火星语 int u; p=root; for(int i=0;i<strlen(str2);i++) { u=idx(str2[i]); if(p->ch[u]==NULL) p->ch[u]=new node; p=p->ch[u]; } p->val=1;//表明为单词节点 strcpy(p->word,str1); } char* query(char* str){//注意str可能只是前缀,所以必须要是单词节点才可以返回 int u; p=root; for(int i=0;i<strlen(str);i++) { u=idx(str[i]); if(p->ch[u]==NULL) return str; p=p->ch[u]; } if(p->val) return p->word; else return str; } int main(){ cin>>str1; while(cin>>str1){ if(str1[0]=='E')//strcmp(str,"END")==0 break; cin>>str2; insert(str1,str2); } cin>>str1; getchar();//如果不加getchar的话,START下面会多一行空格,不知道怎么回事 while(gets(str)) { if(str[0]=='E') break; for(int i=0,k=0;i<strlen(str);i++)//strlen不会跳过空白字符!!!!!! { if(str[i]<'a'||str[i]>'z'){ buf[k]='\0'; cout<<query(buf); cout<<str[i]; k=0; } else buf[k++]=str[i]; } cout<<endl; } return 0; }