1
+ // TRIE
2
+ #include < bits/stdc++.h>
3
+ using namespace std ;
4
+
5
+ #define INF 0x3f3f3f3f
6
+ #define MOD 1000000007
7
+ #define si (x ) scanf(" %d" ,&x)
8
+ #define sii (x,y ) scanf(" %d%d" ,&x,&y)
9
+ #define siii (x,y,z ) scanf(" %d%d%d" ,&x,&y,&z)
10
+ #define sl (x ) scanf(" %lld" ,&x)
11
+ #define sll (x,y ) scanf(" %lld%lld" ,&x,&y)
12
+ #define slll (x,y,z ) scanf(" %lld%lld%lld" ,&x,&y,&z)
13
+
14
+ #define ll long long
15
+ #define mp make_pair
16
+ #define pb push_back
17
+ #define nl printf (" \n " );
18
+ #define pf printf
19
+ #define rep (i,n ) for (ll i=0 ;i<n;i++)
20
+ #define repi (i,a,b ) for (ll i=a;i<b;i++)
21
+ #define vint vector<int >
22
+ #define tci int t;scanf(" %d" ,&t);while (t--)
23
+ const int maxn=10e6 +4 ;
24
+
25
+ struct Trie {
26
+ struct Trie *child[27 ];
27
+ map<char ,Trie*>m;
28
+ int w;
29
+ };
30
+ struct Trie *getNode (void )
31
+ {
32
+ struct Trie *p = new Trie;
33
+ p->w = 0 ;
34
+ for (int i = 0 ; i < 27 ; i++)
35
+ p->child [i] = NULL ;
36
+ return p;
37
+ }
38
+
39
+
40
+ int res=0 ;
41
+ int rec (struct Trie *p)
42
+ {
43
+ for (int i=0 ;i<27 ;i++)
44
+ {
45
+ if (p->child [i]!=NULL )
46
+ {
47
+ res= max (rec (p->child [i]),res);
48
+ }
49
+ }
50
+ return p->w ;
51
+ }
52
+
53
+ void insert (struct Trie *root,string s,int weight)
54
+ {
55
+ struct Trie *p=root;
56
+ for (int i=0 ;i<s.size ();i++)
57
+ {
58
+ int ind=int (s[i]-' a' );
59
+ if (p->child [ind]==0 )
60
+ p->child [ind]=getNode ();
61
+ p=p->child [ind];
62
+ }
63
+ p->w =weight;
64
+ // cout<<p->w;nl
65
+ }
66
+ void search (struct Trie *root,string s)
67
+ {
68
+ int temp=0 ;
69
+ struct Trie *p = root;
70
+ for (int i = 0 ; i < s.size (); i++)
71
+ {
72
+ int ind = s[i] - ' a' ;
73
+ // cout<<s[i]<<" ";
74
+ if (!p->child [ind])
75
+ {
76
+ temp=1 ;
77
+ cout<<-1 <<endl;break ;// return false;
78
+ }
79
+ p = p->child [ind];
80
+ }
81
+ if (p != NULL && !temp )
82
+ {
83
+ rec (p);
84
+ cout<<res;nl
85
+ }
86
+ }
87
+ int main ()
88
+ {
89
+ ifstream myFile (" task.in" );
90
+ if (!myFile.fail ())
91
+ {
92
+ assert (freopen (" task.in" , " r" , stdin));
93
+ }
94
+ struct Trie *root=getNode ();
95
+ int n,q;sii (n,q);
96
+ rep (i,n)
97
+ {
98
+ string s;
99
+ int weight;
100
+ cin>>s>>weight;
101
+ insert (root,s,weight);
102
+ }
103
+ while (q--)
104
+ {
105
+ res=0 ;
106
+ string s;
107
+ cin>>s;
108
+ search (root,s);
109
+ }
110
+ return 0 ;
111
+ }
0 commit comments