hdu5687

来源:互联网 发布:sqlserver case when 编辑:程序博客网 时间:2024/06/15 15:54
度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 

  1、insert : 往神奇字典中插入一个单词 

  2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词 

  3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串 
Input
这里仅有一组测试数据。第一行输入一个正整数N(1N100000)N(1≤N≤100000),代表度熊对于字典的操作次数,接下来NN行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。
Output
对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。
Sample Input
5insert helloinsert hehesearch hdelete hesearch hello
Sample Output
Yes

No

AC代码:

#include<stdio.h>#include<cstdio>#include<vector>#include<iostream>#include<algorithm>#include<cstring>#include<string.h>#include<queue>#include<stack>#include<cmath>#include<set>#include<map>#include<string>using namespace std;const int N=(1e5+10)*30;typedef long long ll;int top;//top表示节点个数int tree[N][27];//字典树int val[N];//记录某个节点出现的次数void Insert(char *s){        int len=strlen(s);        int u=0;        for(int i=0;i<len;i++)        {                int c=s[i]-'a';                if(!tree[u][c])                {                        memset(tree[top],0,sizeof tree[top]);                        val[top]=1;                        tree[u][c]=top++;                }                else                {                        int x=tree[u][c];                        val[x]++;                }                u=tree[u][c];        }}int Search(char *str){        int len=strlen(str);        int u=0;        for(int i=0;i<len;i++)        {                int c=str[i]-'a';                u=tree[u][c];                if(!u)                        return -1;        }        return val[u];}void Delete(char *str,int v){        int len=strlen(str);        int u=0;        for(int i=0;i<len;i++)        {                int c=str[i]-'a';                u=tree[u][c];                val[u]-=v;        }        memset(tree[u],0,sizeof tree[u]);}int main(){        int n;        scanf("%d",&n);        top=1;        memset(tree[0],0,sizeof tree[0]);        while(n--)        {                char op[10],str[40];                scanf("%s %s",op,str);                if(op[0]=='i')                        Insert(str);                else if(op[0]=='s')                {                        if(Search(str)>0)                                printf("Yes\n");                        else                                printf("No\n");                }                else                {                        int v=Search(str);                        if(v>0)                        {                                Delete(str,v);                        }                }        }        return 0;}