import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        // 注意 hasNext 和 hasNextLine 的区别
        String line = null;
        while ((line = in.readLine()) != null) { // 注意 while 处理多个 case
            int m = Integer.parseInt(line);
            Trie trie = new Trie();
            trie.build();
            for (int i = 0; i < m; i++) {

                String[] lines = in.readLine().split(" ");
                int op = Integer.parseInt(lines[0]);
                String world = lines[1];
                if (op == 1) {
                    trie.insert(world);
                } else if (op == 2) {
                    trie.delete(world);
                } else if (op == 3) {
                    int yes = trie.search(world);
                    out.println(yes > 0 ? "YES" : "NO");
                } else if (op == 4) {
                    out.println(trie.prefixNumber(world));
                }
            }
            trie.clear();
        }
        out.flush();
        out.close();
        in.close();
    }

    static class Trie {
        private static int MAXN = 150001;
        private int[] pass = new int[MAXN];
        private int[] end = new int[MAXN];
        private int[][] nexts = new int[MAXN][26];
        private int cnt;
        public void build() {
            cnt = 1;
        }
        public void clear() {
            for (int i = 0; i < cnt; i++) {
                Arrays.fill(nexts[i], 0);
                pass[i] = 0;
                end[i] = 0;
            }
        }
        public void insert(String word) {
            int n = word.length();
            int cur = 1;
            pass[cur]++;
            for (int i = 0; i < n; i++) {
                int path = word.charAt(i) - 'a';
                if (nexts[cur][path] == 0) {
                    nexts[cur][path] = ++cnt;
                }
                cur = nexts[cur][path];
                pass[cur]++;
            }
            end[cur]++;
        }

        public void delete(String word) {
            if (search(word) <= 0) {
                return;
            }
            int cur = 1;
            int n = word.length();
            for (int i = 0; i < n; i++) {
                int path = word.charAt(i) - 'a';
                if (--pass[nexts[cur][path]] == 0) {
                    nexts[cur][path] = 0;
                    return;
                }
                cur = nexts[cur][path];
            }
            end[cur]--;
        }
        public int search(String word) {
            int cur = 1;
            int n = word.length();
            for (int i = 0; i < n; i++) {
                int path = word.charAt(i) - 'a';
                if (nexts[cur][path] == 0) {
                    return 0;
                }
                cur = nexts[cur][path];
            }
            return end[cur];
        }

        public int prefixNumber(String pre) {
            int cur = 1;
            int n = pre.length();
            for (int i = 0; i < n; i++) {
                int path = pre.charAt(i) - 'a';
                if (nexts[cur][path] == 0) {
                    return 0;
                }
                cur = nexts[cur][path];
            }
            return pass[cur];
        }
    }
}