Pagini recente » Cod sursa (job #1118811) | Cod sursa (job #548451) | Cod sursa (job #2101565) | Cod sursa (job #2101563) | Cod sursa (job #1473294)
#include <bits/stdc++.h>
using namespace std;
#define letter s[i]-'a'
const int alpha_size = 26;
int op;
string str;
class PrefixTree {
private :
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);
}
public :
void pushWord(PrefixTree *node, int i, string s){
if (!isalpha(s[i])) {
++node->count_words;
return;
}
if (!node->son[letter]) {
node->son[letter]=new PrefixTree;
++node->count_childs;
}
pushWord(node->son[letter],i+1,s);
}
bool popWord(PrefixTree* node,int i,string s){
if (!isalpha(s[i])) {
--node->count_words;
}
else {
if (node->popWord(node->son[letter],i+1,s)) {
--node->count_childs;
node->son[letter]=NULL;
}
}
if (node->count_childs == 0 && node->count_words == 0 && node != root) {
delete node;
return 1;
}
return 0;
}
int getNumberOfWords(PrefixTree* node,int i,string s){
if (!isalpha(s[i])) return node->count_words;
if (!node->son[letter]) return 0;
return getNumberOfWords(node->son[letter],i+1,s);
}
int getLengthOfPrefix (PrefixTree* node, int i, string s) {
if (!isalpha(s[i]) || !node->son[letter] ) return i;
return getLengthOfPrefix(node->son[letter],i+1,s);
}
} Trie;
int main() {
ifstream cin("trie.in");
ofstream cout("trie.out");
Trie.root = new PrefixTree;
while (cin>>op>>str) {
switch(op){
case 0 : Trie.pushWord(Trie.root,0,str); break;
case 1 : Trie.popWord(Trie.root,0,str); break;
case 2 : cout<<Trie.getNumberOfWords(Trie.root,0,str)<<'\n'; break;
default : cout<<Trie.getLengthOfPrefix(Trie.root,0,str)<<'\n'; break;
}
}
return 0;
}