import java.util.*;
public class Solution {
/**
*
* @param operators string字符串二维数组 the ops
* @return string字符串一维数组
*/
int[][] trie = new int[(int)2e6+10][26];
int[] end = new int[(int)2e6+10];
int[] pre = new int[(int)2e6+10];
int cnt = 0;
void insert(String x){
int p = 0;
for(int i = 0; i < x.length(); i++){
int t = x.charAt(i)-'a';
if(trie[p][t] == 0){
trie[p][t] = ++cnt;
}
p = trie[p][t];
pre[p]++;
}
end[p]++;
}
boolean isExist(String x){
int p = 0;
for(int i = 0; i < x.length(); i++){
int t = x.charAt(i)-'a';
if(trie[p][t] == 0){
return false;
}
p = trie[p][t];
}
return end[p] == 0 ? false:true;
}
void remove(String x){
if(!isExist(x)){
return;
}
int p = 0;
for(int i = 0; i < x.length(); i++){
int t = x.charAt(i)-'a';
p = trie[p][t];
pre[p]--;
}
end[p]--;
}
int queryPre(String x){
int p = 0;
for(int i = 0; i < x.length(); i++){
int t = x.charAt(i)-'a';
if(trie[p][t] == 0){
return 0;
}
p = trie[p][t];
}
return pre[p];
}
public String[] trieU (String[][] operators) {
// write code here
ArrayList<String> list = new ArrayList<>();
for(String[] x:operators){
if("1".equals(x[0])){
insert(x[1]);
}else if("2".equals(x[0])){
remove(x[1]);
}else if("3".equals(x[0])){
if(isExist(x[1])){
list.add("YES");
}else{
list.add("NO");
}
}else{
list.add(""+queryPre(x[1]));
}
}
String[]ans = new String[list.size()];
int t = 0;
for(String x:list){
ans[t++] = x;
}
return ans;
}
}