Intelligent IME HDU - 4287 字典树

题意:

给你m个字符串,每一个字符对应一个数字,如下:

2 : a, b, c    3 : d, e, f    4 : g, h, i    5 : j, k, l    6 : m, n, o     7 : p, q, r, s    8 : t, u, v    9 : w, x, y, z

输入n个数字串,问这个数字串可以对应几个字符串

比如ade这个字符串对应的数字串就是233

题解:

用这m个字符串建立一颗字典树,对于每一个节点维护一个变量val,他就代表(从树根到这个节点这一个数字串)有多少个对应的字符串

每次插入的时候记录一下最大值就完了

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 using namespace std;
 7 typedef struct Trie* TrieNode;
 8 char s[130];
 9 char v[5005][10];
10 struct Trie
11 {
12     int val;
13     TrieNode next[8];
14     Trie()
15     {
16         val = 0;
17         memset(next,NULL,sizeof(next));
18     }
19 };
20 
21 void inserts(TrieNode root,char ss[10])
22 {
23     TrieNode p = root;  //建立的字典树是字符串对应的数字串
24     int len=strlen(ss);
25     for(int i=0;i<len;++i)
26     {
27         int temp=s[ss[i]];
28         if(p->next[temp]==NULL) p->next[temp]=new struct Trie();
29         p=p->next[temp];
30     }
31     p->val+=1;
32 }
33 
34 int query(TrieNode root,char ss[10])
35 {
36     TrieNode p = root;
37     int len=strlen(ss);
38     for(int i=0;i<len;++i)
39     {
40         int temp=ss[i]-'0'-2;
41         if(p->next[temp]==NULL)
42         {
43             //printf("%d**\n",i);
44             return 0;
45         }
46         else
47         {
48             p=p->next[temp];
49         }
50     }
51     return p->val;
52 }
53 
54 void Del(TrieNode root)
55 {
56     for(int i=0 ; i<8 ; ++i)
57     {
58         if(root->next[i])Del(root->next[i]);
59     }
60     delete(root);
61 }
62 
63 int main()
64 {
65     s['a']=s['b']=s['c']=0;
66     s['d']=s['e']=s['f']=1;
67     s['g']=s['h']=s['i']=2;
68     s['j']=s['k']=s['l']=3;
69     s['m']=s['n']=s['o']=4;
70     s['p']=s['q']=s['r']=s['s']=5;
71     s['t']=s['u']=s['v']=6;
72     s['w']=s['x']=s['y']=s['z']=7;
73     int t,n,m;
74     char ss[10];
75     scanf("%d",&t);
76     while(t--)
77     {
78         TrieNode root = new struct Trie();
79         scanf("%d %d",&n,&m);
80         for(int i=0 ; i<n ; ++i)
81         {
82             scanf("%s",v[i]);
83         }
84         for(int i=0 ; i<m ; ++i)
85         {
86             scanf("%s",ss);
87             inserts(root,ss);
88         }
89         for(int i=0;i<n;++i)
90         {
91             printf("%d\n",query(root,v[i]));
92         }
93         Del(root);
94     }
95     return 0;
96 }

猜你喜欢

转载自www.cnblogs.com/kongbursi-2292702937/p/12001362.html