#include #include #include #include #include #include #include #include #include #include #include #define MAX 100100 #define mod 9973 using namespace std; typedef long long LL; char op[100], s[100]; struct Trie { int ch[30 * MAX][26]; int val[30 * MAX]; int self[30 * MAX]; bool lazy[30 * MAX]; int sz; Trie() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); lazy[0] = false; val[0] = 0; self[0] = 0; } int idx(char c) { return c - 'a'; } void PushDown(int o) { if (lazy[o]) { for (int i = 0; i < 26; ++i) { if (!ch[o][i]) continue; lazy[ch[o][i]] = true; val[ch[o][i]] = 0; self[ch[o][i]] = 0; } lazy[o] = false; } } void PushUp(int o) { val[o] = self[o]; for (int i = 0; i < 26; ++i) { if (!ch[o][i]) continue; val[o] += val[ch[o][i]]; } } void Insert(int u, int p, int n) { if (p == n) { self[u]++; val[u]++; return; } PushDown(u); int c = idx(s[p]); if (!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); lazy[sz] = false; val[sz] = 0; ch[u][c] = sz++; } Insert(ch[u][c], p + 1, n); PushUp(u); } void insert(char *s) { int n = (int)strlen(s); Insert(0, 0, n); } void Del(int u, int p, int n) { if (p == n) { lazy[u] = true; val[u] = 0; self[u] = 0; return; } PushDown(u); int c = idx(s[p]); if (ch[u][c]) { Del(ch[u][c], p + 1, n); } PushUp(u); } void del(char *s) { int n = (int)strlen(s); Del(0, 0, n); } int Query(int u, int p, int n) { if (p == n) return val[u]; PushDown(u); int c = idx(s[p]); int res = 0; if (ch[u][c]) { res = Query(ch[u][c], p + 1, n); } PushUp(u); return res; } int query(char *s) { int n = (int)strlen(s); return Query(0, 0, n); } } trie; int main() { int T; scanf("%d", &T); for (int t = 0; t < T; ++t) { scanf("%s", op); scanf("%s", s); switch (op[0]) { case 'i': trie.insert(s); break; case 'd': trie.del(s); break; case 's': printf("%s\n", trie.query(s) ? "Yes" : "No"); default: break; } } return 0; }