//#pragma comment(linker, "/STACK:102400000,102400000") #include #include #include #include #include #include #include #include #include #include using namespace std; #define MZ(array) memset(array, 0, sizeof(array)) #define MF1(array) memset(array, -1, sizeof(array)) #define MINF(array) memset(array, 0x3f, sizeof(array)) #define REP(i,n) for(i=0;i<(n);i++) #define FOR(i,x,n) for(i=(x);i<=(n);i++) #define FORD(i,x,y) for(i=(x);i>=(y);i--) #define RD(x) scanf("%d",&x) #define RD2(x,y) scanf("%d%d",&x,&y) #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define WN(x) printf("%d\n",x); #define RE freopen("D.in","r",stdin) #define WE freopen("huzhi.txt","w",stdout) #define MP make_pair #define PB push_back #define PF push_front #define PPF pop_front #define PPB pop_back typedef long long LL; typedef unsigned long long ULL; const double PI=acos(-1.0); const double EPS=1e-10; const int MAXN=111111; const int MAXM=33; class Trie{ public: Trie* a[26]; int n; Trie(){ int i; REP(i,26)a[i]=NULL; n=0; } }; Trie root; inline void ins(char s[MAXM]) { int l=strlen(s); int i,j; Trie *pre = &root; REP(i,l) { int c = s[i] - 'a'; Trie *x = pre->a[c]; if(x==NULL) { pre->a[c] = new Trie(); x = pre->a[c]; } pre->n++; pre=x; } pre->n++; } inline Trie* sch(char s[MAXM]) { int l=strlen(s); int i; Trie *x = &root; REP(i,l) { int c = s[i]-'a'; x = x->a[c]; if(x==NULL || x->n<=0)return NULL; } return x; } inline void delSon(Trie *x){ int i; if(x->n<=0)return; REP(i,26)if(x->a[i]!=NULL){ delSon(x->a[i]); } // delete(x); x->n=0; } inline int del(const int &now, const int &l ,Trie *x, char s[MAXM]) { char c = s[now]-'a'; Trie *w = x->a[c]; if(w==NULL || w->n<=0)return 0; if(now==l-1){ int n = w->n; // x->a[c]=NULL; delSon(w); return n; } w->n -= del(now+1, l, w, s); } int main() { int i,n; char c[MAXM],s[MAXM]; RD(n); root = Trie(); REP(i,n) { scanf(" %s %s",c,s); if(c[0]=='i')ins(s); else if(c[0]=='d')del(0,strlen(s),&root,s); else { if(sch(s)!=NULL) puts("Yes"); else puts("No"); } } return 0; }