題目連接: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 }