Pagini recente » Cod sursa (job #2307426) | Cod sursa (job #6997) | Cod sursa (job #2315721) | Cod sursa (job #406343) | Cod sursa (job #1810135)
#include <fstream>
#include <cstring>
#include <string>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
int cnt, nr_sons;
Trie *children[ 26 ];
Trie() {
cnt = nr_sons = 0;
memset( children, 0, sizeof( children ) );
}
};
Trie *T = new Trie;
void ins(Trie *node, char *w){
if(!*w){
++node->cnt;
return;
}
int pos = *w - 'a';
if(node->children[pos] == 0){
node->children[pos] = new Trie;
++node->nr_sons;
}
ins(node->children[pos], w + 1);
}
int del(Trie *node, char *w){
int pos = *w - 'a';
if(!*w){
--node->cnt;
}
else if(del(node->children[pos], w + 1) == 1){
--node->nr_sons;
node->children[pos] = 0;
}
if(node->cnt == 0 && node->nr_sons == 0){
delete node;
return 1;
}
return 0;
}
int Query(Trie *node, char *w){
if(!*w){
return node->cnt;
}
int pos = *w - 'a';
Query(node->children[pos], w + 1);
}
int Comm(Trie *node, char *w, int k){
int pos = *w - 'a';
if(!*w || node->children[pos] == 0){
return k;
}
Comm(node->children[pos], w + 1, k + 1);
}
int main() {
char s[27];
int op;
while(fin>> op >> s){
if(op == 0){
ins(T, s);
}
if(op == 1){
del(T, s);
}
if(op == 2){
fout<< Query(T, s) << '\n';
}
if(op == 3){
fout<< Comm(T, s, 0) << '\n';
}
}
return 0;
}