#
# 
# @param operators string字符串二维数组 the ops
# @return string字符串一维数组
#


class Solution:
    def __init__(self):
        self.mark = {} 

    def trieU(self , operators ):
        res = []
        for operator in operators:
            if operator[0] == '1':
                self.insert(operator[1],self.mark)
            elif operator[0] == '2':
                self.delete(operator[1],self.mark)
            elif operator[0] == '3':
                contains = 'YES' if self.search(operator[1]) else 'NO'
                res.append(contains)
            elif operator[0] == '4':
                num = self.prefixNumber(operator[1])
                res.append(str(num))
#             print(self.mark)
        return res



    def search(self,word):
        if not word:
            return True
        root = self.mark
        for c in word:
            if c not in root:
                return False
            root = root[c]
        return '#' in root




    def prefixNumber(self,word):
        if not word:
            return 0
        root = self.mark

        for c in word:
            if c not in root:
                return False
            root = root[c]
        def count(root):
            res = 0
            for k,v in root.items():
                if k=='#':
                    res += 1
                else:
                    res += count(v)
            return res
        return count(root)


    def insert(self,word,root):
        if not word:
            root['#'] = {}
            return root
        c = word[0]
        root[c] = self.insert(word[1:], root.get(c,{}))
        return root



    def delete(self,word,root):
#         print(word,root)
        if not word :
            if '#' in root:
                root.pop('#')
#             print(root)
            return root
        c = word[0]
        if c not in root:
            return root
        root[c] = self.delete(word[1:], root.get(c,{}))
        return root