Mai intai trebuie sa te autentifici.
Cod sursa(job #1474440)
Utilizator | Data | 21 august 2015 23:15:59 | |
---|---|---|---|
Problema | Trie | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.38 kb |
#include <bits/stdc++.h>
using namespace std;
const int alpha_size = 26;
int op;
char word[30];
class PrefixTree {
public :
vector <PrefixTree*> son;
PrefixTree *root;
int count_words;
int count_childs;
PrefixTree(){
this->count_words=0;
this->count_childs=0;
this->son.resize(alpha_size,NULL);
}
void pushWord(PrefixTree *node, char *letter){
if (!isalpha(*letter)) {
++node->count_words;
return;
}
if (!node->son[*letter-'a']) {
node->son[*letter-'a']=new PrefixTree;
++node->count_childs;
}
pushWord(node->son[*letter-'a'],letter+1);
}
bool popWord(PrefixTree* node,char *letter){
if (!isalpha(*letter)) {
--node->count_words;
}
else {
if (node->popWord(node->son[*letter-'a'],letter+1)) {
--node->count_childs;
node->son[*letter-'a']=NULL;
}
}
if (node->count_childs == 0 && node->count_words == 0 && node != root) {
delete node;
return 1;
}
return 0;
}
int getNumberOfWords(PrefixTree* node,char *letter){
if (!isalpha(*letter)) return node->count_words;
if (!node->son[*letter-'a']) return 0;
return getNumberOfWords(node->son[*letter-'a'],letter+1);
}
int getLengthOfPrefix (PrefixTree* node, char *letter) {
if (!isalpha(*letter) || !node->son[*letter-'a'] ) return (letter-word);
return getLengthOfPrefix(node->son[*letter-'a'],letter+1);
}
} Trie;
int main() {
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
Trie.root = new PrefixTree;
while (cin>>op>>word) {
switch(op){
case 0 : Trie.pushWord(Trie.root,word); break;
case 1 : Trie.popWord(Trie.root,word); break;
case 2 : printf("%d\n",Trie.getNumberOfWords(Trie.root,word)); break;
default : printf("%d\n",Trie.getLengthOfPrefix(Trie.root,word)); break;
}
}
return 0;
}