解题思路:裸tire,没什么好说的。
/* ***********************************************
┆ ┏┓ ┏┓ ┆
┆┏┛┻━━━┛┻┓ ┆
┆┃ ┃ ┆
┆┃ ━ ┃ ┆
┆┃ ┳┛ ┗┳ ┃ ┆
┆┃ ┃ ┆
┆┃ ┻ ┃ ┆
┆┗━┓ 马 ┏━┛ ┆
┆ ┃ 勒 ┃ ┆
┆ ┃ 戈 ┗━━━┓ ┆
┆ ┃ 壁 ┣┓┆
┆ ┃ 的草泥马 ┏┛┆
┆ ┗┓┓┏━┳┓┏┛ ┆
┆ ┃┫┫ ┃┫┫ ┆
┆ ┗┻┛ ┗┻┛ ┆
************************************************ */
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++)
#define per(i,a,b) for (int i=(b),_ed=(a);i>=_ed;i--)
const int inf_int = 2e9;
const long long inf_ll = 2e18;
#define mod 1000000007
#define ll long long
#define ull unsigned long long
struct tire
{
tire *word[26];
int cnt;
tire()
{
cnt=0;
for(int i=0;i<26;i++)
word[i]=NULL;
}
};
void build(tire *rt,char *str)
{
int i;
for(i=0;str[i]!='\0';i++)
{
if(!rt->word[str[i]-'a'])
{
rt->word[str[i]-'a']=new tire();
}
rt->word[str[i]-'a']->cnt++;
rt=rt->word[str[i]-'a'];
}
}
bool findtire(tire *rt,char *str)
{
int i;
for(i=0;str[i]!='\0';i++)
{
if(rt->word[str[i]-'a'])
rt=rt->word[str[i]-'a'];
else
break;
}
if(str[i]=='\0')
{
if(rt->cnt>0)
return true;
}
return false;
}
void del(tire *rt,char *str)
{
tire *head,*tail;
head=rt;
int num,i;
for(i=0;str[i]!='\0';i++)
{
if(rt->word[str[i]-'a'])
{
tail=rt;
num=rt->word[str[i]-'a']->cnt;
rt=rt->word[str[i]-'a'];
}
else
break;
}
if(str[i]=='\0')
{
free(tail->word[str[i-1]-'a']);
tail->word[str[i-1]-'a']=NULL;
for(int j=0;str[j]!='\0';j++)
{
if(head->word[str[j]-'a']!=NULL)
{
head->word[str[j]-'a']->cnt-=num;
head=head->word[str[j]-'a'];
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
tire *rt=new tire();
int n;
scanf("%d",&n);
while(n--)
{
char s[35],order[10];
scanf("%s %s",order,s);
if(order[0]=='i')
{
build(rt,s);
}
else if(order[0]=='d')
{
del(rt,s);
}
else
{
if(findtire(rt,s))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
return 0;
}