#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long LL; typedef long double LD; typedef vector VI; typedef pair PII; const LD eps=1e-9; const LD PI=atan2((LD)0,(LD)-1); const LL MOD=1000000007; const int INF=1<<30; const int ARR_INF=1<<6; const int MAXN=100005; const int NXTNUM=26; const int WORDLEN=35; const int MAXNODE=MAXN*WORDLEN; struct Trie { int nxt[NXTNUM]; int num; void init(){num=0;memset(nxt,-1,sizeof(nxt));} }trie[MAXNODE]; int tot; void Init() { tot=0; trie[0].init(); return; } void Insert(char *str) { int now=0; for(int i=0;str[i]!='\0';i++) { int ch=str[i]-'a'; if(trie[now].nxt[ch]==-1) { trie[now].nxt[ch]=++tot; trie[tot].init(); } now=trie[now].nxt[ch]; trie[now].num++; } return; } bool SearchPre(char *str) { int now=0; for(int i=0;str[i]!='\0';i++) { int ch=str[i]-'a'; if(trie[now].nxt[ch]==-1) return false; now=trie[now].nxt[ch]; if(!trie[now].num) return false; } return true; } int DeleteNum(char *str) { int now=0; for(int i=0;str[i]!='\0';i++) { int ch=str[i]-'a'; if(trie[now].nxt[ch]==-1) return 0; now=trie[now].nxt[ch]; if(!trie[now].num) return 0; } return trie[now].num; } void DeletePre(char *str) { int num=DeleteNum(str); if(!num) return; int now=0; for(int i=0;str[i]!='\0';i++) { int ch=str[i]-'a'; now=trie[now].nxt[ch]; trie[now].num-=num; } trie[now].init(); return; } int main() { int n; char cmd[10],str[35]; while(scanf("%d",&n)!=EOF) { Init(); while(n--) { scanf("%s%s",cmd,str); if(cmd[0]=='i') Insert(str); if(cmd[0]=='s') { if(SearchPre(str)) printf("Yes\n"); else printf("No\n"); } if(cmd[0]=='d') DeletePre(str); } } return 0; }