首页 > 代码库 > hdu1705(字典树)

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(字典树)