hdu1705(字典樹)
阿新 • • 發佈:2017-05-23
++ pid nbsp cout string char scanf amp pan
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1075
兩個星期沒有刷題了,,從今天開始吧,先從hiho開始刷,鞏固一下之前學的。。
可以用trie樹做,也可以用map。。。
發現自己對一些字符串的基礎輸入輸出還是存在問題,一直不是很理解。
1 #include <cstdio> 2 #include <cstring> 3 #include <cctype> 4 char a[15],b[15],s[3010]; 5 6 struct Trie 7 { 8 char c[15]; 9 Trie *nex[26]; 10 int flag; 11 Trie() 12 { 13 flag=0; 14 for(int i=0;i<26;i++) 15 nex[i]=NULL; 16 } 17 }; 18 Trie rt; 19 void inser(char *b, char *a) 20 { 21 Trie *head=&rt; 22 int len=strlen(b); 23 for(int i=0;i<len;i++) 24 { 25 int k=b[i]-‘a‘; 26 if(head->nex[k]==NULL) 27 { 28 Trie *node=new Trie; 29 head->nex[k]=node; 30 } 31 head=head->nex[k]; 32 } 33 head->flag=1; 34 strcpy(head->c,a); 35 } 36 37 int get(char *a) 38 { 39 Trie *head=&rt; 40 intlen=strlen(a); 41 for(int i=0;i<len;i++) 42 { 43 int k=a[i]-‘a‘; 44 if(head->nex[k]==NULL) return 0; 45 head=head->nex[k]; 46 } 47 if(head->flag==1) 48 { 49 strcpy(b,head->c); 50 return 1; 51 } 52 else return 0; 53 } 54 int main() 55 { 56 scanf("%s",a); 57 while(scanf("%s",a)) 58 { 59 if(strcmp(a,"END")==0) break; 60 scanf("%s",b); 61 inser(b,a); 62 } 63 scanf("%s",a); 64 getchar(); // 65 while(gets(s)) //應該是讀入了換行符 66 { 67 if(strcmp(s,"END")==0) break; 68 int len=strlen(s); 69 int k=0; 70 for(int i=0;i<len;i++) 71 { 72 if(islower(s[i])) 73 { 74 a[k++]=s[i]; 75 } 76 else 77 { 78 a[k]=0; 79 if(get(a)) printf("%s",b); 80 else printf("%s",a); 81 printf("%c",s[i]); 82 k=0; 83 } 84 } 85 puts(""); 86 } 87 return 0; 88 }
map:
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <map> 5 #include <string> 6 #include <cctype> 7 using namespace std; 8 9 const int maxn=100010; 10 map< string ,string > m; 11 string s,a,b; 12 char c; 13 int main() 14 { 15 cin>>s; 16 while(cin>>a) 17 { 18 if(a=="END") break; 19 cin>>b; 20 m[b]=a; 21 } 22 cin>>s; 23 getchar(); //讀入換行符,否則會讀到下面的s裏面去,又會輸出到START行的末尾,發生難以察覺的錯誤-_-|| 24 a=""; 25 while(getline(cin,s)) //邊讀入邊處理快很多,不用一次讀完一行 (getline對讀入換行符) 26 { 27 if(s=="END") break; 28 int len=s.length(); 29 for(int i=0;i<len;i++) 30 { 31 if(islower(s[i])) a+=s[i]; 32 else 33 { 34 if(m.count(a)) cout<<m[a]; 35 else cout<<a; 36 cout<<s[i]; 37 a=""; 38 } 39 } 40 cout<<endl; 41 } 42 return 0; 43 }
hdu1705(字典樹)