What Are You Talking About hdu1075

来源:互联网 发布:意德法家 知乎 编辑:程序博客网 时间:2024/05/17 22:12

   这题的字符串处理真纠结,搞得我都想吐了,晕,其它的好像没什么好说的,就是个简单的字典树了。

不过通过做这道题,我对scanf和gets的理解更加透彻了,scanf读取字符串时,是从第一的非空格的字母开始读,再次遇到空格或'\n'时结束,它不会处理掉'\r';而gets则按行读(连空格也一起读),遇到'\r'时将其转换为'\0'然后结束。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;struct node{char word[11];bool isTail;node *next[26];}memory[1000000],*root;int cur;node *build_node(){node *p=&memory[cur++];for(int i=0;i<26;i++)p->next[i]=NULL;p->isTail=false;return p;}void insert_tree(char *s1,char *s2){int len=strlen(s1);node *p=root;for(int i=0;i<len;i++){if(p->next[s1[i]-'a']==NULL)p->next[s1[i]-'a']=build_node();p=p->next[s1[i]-'a'];}p->isTail=true;strcpy(p->word,s2);}char *query(char *s){int len=strlen(s);node *p=root;for(int i=0;i<len;i++){if(p->next[s[i]-'a']==NULL)return NULL;p=p->next[s[i]-'a'];}if(p->isTail!=NULL)return p->word;elsereturn NULL;}int main(){char s1[15],s2[15],s[3005],*p,*q;int i;bool state;cur=0;root=build_node();gets(s1);//读"START"//建字典树while(scanf("%s",s1)){if(s1[0]=='E')break;scanf("%s",s2);insert_tree(s2,s1);}//翻译getchar();//处理最后一个‘\n'。gets(s2);//读"START"while(gets(s)){if(s[0]=='E')break;p=s;i=0;while(*p){if(*p<='z'&&*p>='a'){state=true;//在单词中s1[i++]=*p;}else if(state==true){state=false;//出了单词s1[i]='\0';i=0;if((q=query(s1))==NULL)printf("%s",s1);elseprintf("%s",q);putchar(*p);}elseputchar(*p);p++;}putchar('\n');}return 0;}


 

原创粉丝点击