hdu5687
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int maxn = 1e5+5, n = 26;
4 struct node {
5 int next[26];
6 int cnt;
7 void init() {
8 cnt = 0;
9 memset(next,-1,sizeof(next));
10 }
11 };
12 node trie[maxn*n];
13 int tot = 0;
14 void insert(char *s) {
15 int cur = 0, len = strlen(s);
16 for (int i = 0; i < len; i++) {
17 int temp = s[i]-'a';
18 int next = trie[cur].next[temp];
19 if (next == -1) {
20 next = ++tot;
21 trie[next].init();
22 trie[cur].next[temp] = next;
23 }
24 cur = next;
25 trie[cur].cnt++;
26 }
27 }
28 bool find(char *s) {
29 int cur = 0, len = strlen(s);
30 for (int i = 0; i < len; i++) {
31 int temp = s[i]-'a';
32 int next = trie[cur].next[temp];
33 if (next == -1) return false;
34 cur = next;
35 }
36 return trie[cur].cnt > 0;
37 }
38 void del(char * s) {
39 int cur = 0, late, len = strlen(s);
40 for (int i = 0; i < len; i++) {
41 int temp = s[i]-'a';
42 int next = trie[cur].next[temp];
43 if (next == -1) return;
44 late = cur;
45 cur = next;
46 }
47 cur = 0;
48 for (int i = 0; i < len; i++) {
49 int temp = s[i]-'a';
50 int next = trie[cur].next[temp];
51 late = cur;
52 cur = next;
53 trie[cur].cnt--;
54 }
55 trie[cur].init();
56 int temp = s[len-1]-'a';
57 trie[late].next[temp] = -1;
58 }
59 int main() {
60 int n; scanf("%d",&n);
61 char cmd[32], word[32];
62 for (int i = 1; i <= n; i++) {
63 scanf("%s%s",cmd,word);
64 if (cmd[0] == 'i') insert(word);
65 else if (cmd[0] == 's') {
66 if (find(word)) puts("Yes");
67 else puts("No");
68 }
69 else del(word);
70 }
71 return 0;
72 }