1. 程式人生 > >hdu1705(字典樹)

hdu1705(字典樹)

++ 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 int
len=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(字典樹)