hdu1075 ---- What Are You Talking About (字典树)
很明显的字典树查询了,主要是对输入做处理,多次WA后才发现忘了标志单词的前缀的问题了,例如存入hello,后面查找hell是不能查到的,忘了对这个的处理,看到得多练习了。
View Code
1 //Accepted 1075 281MS 71020K 1500 B C++ 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <string> 6 #define M 26 7 using namespace std; 8 int ii; 9 struct Tree{ 10 Tree* next[M]; 11 char val[30]; 12 int flag;//标记是否存在单词 13 Tree() 14 { 15 for(ii=0;ii<M;ii++) 16 next[ii] = 0; 17 flag = 0; 18 } 19 ~Tree() 20 { 21 for (ii=0;ii<M;ii++) 22 delete(next[ii]); 23 } 24 }; 25 Tree* root = new Tree; 26 char a[3133]; 27 void insert(char ss[],char s[]) 28 { 29 int len,i,j; 30 Tree* p; 31 len = strlen(s); 32 p = root; 33 for(i=0;i<len;i++) 34 { 35 j = s[i] - 'a'; 36 if(p->next[j]==0) 37 p->next[j] = new Tree; 38 p = p->next[j]; 39 } 40 strcpy(p->val,ss); 41 p->flag = 1; 42 } 43 void query(char word[]) 44 { 45 int len,i,j; 46 Tree* p; 47 len = strlen(word); 48 p = root; 49 for(i=0;i<len;i++) 50 { 51 j = word[i] - 'a'; 52 if(p->next[j]!=0) 53 p = p->next[j]; 54 else 55 { 56 printf("%s",word); 57 return ; 58 } 59 } 60 if(p->flag == 1) 61 printf("%s",p->val); 62 else 63 printf("%s",word); 64 } 65 int main(void) 66 { 67 char word[15],ans[15]; 68 scanf("%s",word); 69 while(scanf("%s",word),strcmp(word,"END")!=0) 70 { 71 scanf("%s",ans); 72 insert(word,ans); 73 } 74 scanf("%s",word); 75 getchar(); 76 while(gets(a),strcmp(a,"END")!=0) 77 { 78 int i = 0, len = 0; 79 while(a[i]!='\0') 80 { 81 if(a[i] <= 'z' && a[i] >= 'a') 82 { 83 ans[len++]=a[i]; 84 } 85 else 86 { 87 if(len) 88 { 89 ans[len]='\0'; 90 query(ans); 91 } 92 if(a[i]) 93 printf("%c",a[i]); 94 len = 0; 95 } 96 i++; 97 } 98 printf("\n"); 99 } 100 return 0; 101 }


浙公网安备 33010602011771号