题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1075php
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/204800 K (Java/Others)
Total Submission(s): 17509 Accepted Submission(s): 5696
node
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include<malloc.h> 5 6 using namespace std; 7 8 struct node 9 { 10 char *cc;//用来存最后一个单词 11 node *next[26]; 12 int flag;//用来标记 13 node()//初始化 14 { 15 for (int i=0; i<26; i++) 16 { 17 next[i]=NULL; 18 } 19 flag=0; 20 } 21 }; 22 23 node *p,*root=new node(); 24 void insert(char *s,char *t)//对火星文进行建树,在最后一个字符下面存下对应的英文字符串 25 { 26 p=root; 27 for (int i=0; s[i]!='\0'; i++) 28 { 29 int k=s[i]-'a'; 30 if (p->next[k]==NULL) 31 p->next[k]=new node(); 32 p=p->next[k]; 33 } 34 p->flag=1;//用来标记当前火星字符串的结尾有对应的英文字符串 35 p->cc=(char*)malloc((strlen(t)+1)*sizeof(char));//申请动态空间 36 strcpy(p->cc,t);//将对应字符串存下 37 } 38 39 void Search(char *s) 40 { 41 p=root; 42 if(strlen(s)==0) 43 return ; 44 for (int i=0; s[i]!='\0'; i++) 45 { 46 int k=s[i]-'a'; 47 if (p->next[k]==NULL) 48 { 49 printf("%s",s);//把原有字母输出(寻找的字符串不存在的,也就是未所有找完) 50 return; 51 } 52 p=p->next[k]; 53 } 54 if (p->flag) 55 printf ("%s",p->cc);//输出找到的对应的单词 56 else 57 printf ("%s",s);//特殊判断找不到的状况,把原有字母输出(所有找完仍没有对应的) 58 } 59 60 61 int main() 62 { 63 char str[15],ch1[3010],ch2[3010]; 64 char ch[3010]; 65 scanf("%s",&str); 66 while (~scanf("%s",&ch1)) 67 { 68 if (strcmp(ch1,"END")!=0) 69 { 70 scanf("%s",&ch2); 71 insert(ch2,ch1); 72 } 73 else 74 break; 75 } 76 scanf("%s",&str); 77 getchar(); 78 while (gets(ch1)) 79 { 80 if (strcmp(ch1,"END")==0) 81 break; 82 int k=0; 83 // cout<<111111111<<endl; 84 for(int i=0; ch1[i]!='\0'; i++) 85 { 86 if(ch1[i]>'z'||ch1[i]<'a')//将须要判断的字符串分割成一小部分一小部分 87 { 88 //cout<<"333333"<<ch1[i]<<endl; 89 ch[k]='\0';//找到一个就断开 90 Search(ch);//寻找相应的对应单词 91 printf("%c",ch1[i]);//输出断点的字符 92 k=0;//覆盖已经找过的字符,从头一个个存下来 93 } 94 else 95 { 96 ch[k++]=ch1[i];// 将符合条件的字符存下来 97 } 98 } 99 printf("\n"); 100 } 101 return 0; 102 }