插入,删除和查询所有前缀为s2的字符串
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
class node{
public:
int cnt;
node *next[30];
node()
{
cnt = 0;
memset(next,0,sizeof(next));
}
}*root;
int n;
char s1[1000],s2[1000];
void release(node *p)
{
for(int j=0;j<=25;j++)
{
if(p->next[j]!=NULL)
{
release(p->next[j]);
p->next[j]=NULL;
}
}
delete p;
}
void insertTire()
{
int l = strlen(s2);
int i;
node *pre = root;
for(i=0;i<l;i++)
{
if(pre->next[s2[i]-'a']==NULL)
{
node *pre2 = new node;
pre->next[s2[i]-'a'] = pre2;
pre->cnt++;
pre = pre2;
}
else pre = pre->next[s2[i]-'a'];
}
}
bool findTrie()
{
int l = strlen(s2);
int i;
node *pre = root;
for(i=0;i<l;i++)
{
if(pre->next[s2[i]-'a']==NULL)break;
else pre = pre->next[s2[i]-'a'];
}
if(i==l)return true;
else return false;
}
void deleteTrie()
{
int l = strlen(s2);
int i,pre4 = -1;
node *pre = root,*pre3 = NULL;
for(i=0;i<l;i++)
{
if(pre->next[s2[i]-'a']==NULL)return;
else
{
pre = pre->next[s2[i]-'a'];
if(i!=l-1&&pre->cnt>1)
{
pre3 = pre;
pre4 = i;
}
}
}
if(pre3==NULL){
pre3 = root;
pre4 = -1;
}
release(pre3->next[s2[pre4+1]-'a']);
pre3->next[s2[pre4+1]-'a'] = NULL;
}
int main()
{
scanf("%d",&n);
root = new node;
while(n--)
{
scanf("%s%s",s1,s2);
if(strcmp(s1,"insert")==0)insertTire();
else if(strcmp(s1,"search")==0)
{
bool sym = findTrie();
if(sym)printf("Yes\n");
else printf("No\n");
}
else deleteTrie();
}
release(root);
return 0;
}