本文主要是介绍Problem C HDU - 5687(字典树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Problem C
题目链接:HDU - 5687
涉及到字典树的增删查;
#include <bits/stdc++.h>
using namespace std;
struct Trie{int cnt;Trie* next[26];Trie(){cnt=0;for(int i=0; i<26; i++){next[i]=NULL;}}
}root;
void create(char *s){Trie *p=&root;int len=strlen(s);for(int i=0; i<len; i++){int id=s[i]-'a';if(p->next[id]==NULL) p->next[id]=new Trie;p=p->next[id];p->cnt++;}
}
/*
void release(Trie *p){if(p==NULL) return;for(int i=0; i<26; i++){if(p->next[i]!=NULL) release(p->next[i]);}delete p;
}
*/
void del(char *s, int x){Trie *p=&root;int len=strlen(s);for(int i=0; i<len; i++){int id=s[i]-'a';if(p->next[id]==NULL) return;p=p->next[id];p->cnt-=x;}for(int i=0; i<26; i++) p->next[i]=NULL;
}
int find(char *s){Trie *p=&root;int len=strlen(s);for(int i=0; i<len; i++){int id=s[i]-'a';if(p->next[id]==NULL) return 0;p=p->next[id];} return p->cnt;
}
int main(){int N;scanf("%d", &N);char op[10], s[35];for(int i=0; i<N; i++){scanf("%s%s", op, s);if(op[0]=='i') create(s);else if(op[0]=='s') printf("%s\n", find(s)?"Yes":"No");else{if(find(s))del(s, find(s));}}return 0;
}
这篇关于Problem C HDU - 5687(字典树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!