码迷,mamicode.com
首页 > 其他好文 > 详细

Intelligent IME HDU - 4287 字典树

时间:2019-12-07 14:42:01      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:维护   while   for   next   eof   code   space   trie   nod   

题意:

给你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 }

 

 

Intelligent IME HDU - 4287 字典树

标签:维护   while   for   next   eof   code   space   trie   nod   

原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/12001362.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!