hdu1705(字典树)
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu1705(字典树)相关的知识,希望对你有一定的参考价值。
题目链接: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(字典树)的主要内容,如果未能解决你的问题,请参考以下文章