百度之星预选赛1003字典树模板

来源:互联网 发布:算法导论第四版 pdf 编辑:程序博客网 时间:2024/06/05 07:58

插入,删除和查询所有前缀为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;}
0 0