#include #include #include #include #include #include using namespace std; const int MS=32; const int MTRI=MS*100000+5; //最大点数 const int MCHAR=26;//字符集大小 const int BASE='a';//最小字符 struct Trie { int tot,root; int ch[MTRI][MCHAR]; int cnt[MTRI]; bool f[MTRI]; Trie() //建立一棵空树 { memset(ch[1],0,sizeof(ch[1])); f[1]=0; root=tot=1; } void insert(const char *str) //插入链 O(L)L为链长度 { int *cur=&root; for(const char *p=str;*p;++p) { cur=&ch[*cur][*p-BASE]; if(*cur==0) *cur=++tot; cnt[*cur]++; memset(ch[tot],0,sizeof(ch[tot])); f[tot]=0; } f[*cur]=1; } int query(const char *str) //询问链是否存在 O(L)L为链长度 { int *cur=&root; for(const char *p=str;*p&&*cur;++p) cur=&ch[*cur][*p-BASE]; if(*cur) return cnt[*cur]; return 0; } void del(const char *str) { int sub=query(str); int *cur=&root; for(const char *p=str;*p&&*cur;++p) { cnt[*cur]-=sub; cur=&ch[*cur][*p-BASE]; } if(*cur) { cnt[*cur]=0; f[*cur]=0; memset(ch[*cur],0,sizeof(ch[*cur])); } } }trie; char con[20],s[MS]; int main() { int n; scanf("%d",&n); while(n--) { scanf("%s%s",con,s); if(con[0]=='i') trie.insert(s); else if(con[0]=='s') printf("%s\n",trie.query(s)>0?"Yes":"No"); else trie.del(s); } return 0; }