Pagini recente » Cod sursa (job #1153898) | Cod sursa (job #2021425) | Cod sursa (job #1195488) | Cod sursa (job #1827430) | Cod sursa (job #2931029)
#include <bits/stdc++.h>
#define N 100005
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie {
int number, nrFii;
Trie* children[27];
Trie() {
nrFii = number = 0;
memset(children, 0, sizeof(children));
}
};
Trie *T = new Trie;
void insert(Trie *node, char *word) {
if(!isalpha(*word)) {
node->number++;
return;
}
int next = *word - 'a';
if(!(node->children[next])) {
node->nrFii++;
node->children[next] = new Trie;
}
insert(node->children[next], word + 1);
}
bool del(Trie *node, char *word) {
int next = *word - 'a';
if(!isalpha(*word)) {
node->number--;
} else if(del(node->children[next], word + 1)) {
node->nrFii--;
node->children[next] = 0;
}
if(node->nrFii == 0 && node->number == 0 && node != T) {
delete node;
return true;
}
return false;
}
int occ(Trie* node, char *word) {
if(!isalpha(*word)) {
return node->number;
}
int next = *word - 'a';
if(node->children[next]) {
return occ(node->children[next], word + 1);
}
return 0;
}
int prefix(Trie *node, char *word, int len) {
if(!isalpha(*word) || !(node->children[*word - 'a'])) {
return len;
}
return prefix(node->children[*word - 'a'], word + 1, len + 1);
}
void solve() {
int x;
char word[21];
while(f>>x>>word) {
if(!x) {
insert(T, word);
} else if(x == 1) {
del(T, word);
} else if(x == 2) {
g<<occ(T, word)<<'\n';
} else {
g<<prefix(T, word, 0)<<'\n';
}
}
}
int main() {
solve();
return 0;
}