Pagini recente » Cod sursa (job #547845) | Cod sursa (job #3189095) | Cod sursa (job #2078607) | Cod sursa (job #542290) | Cod sursa (job #1474567)
#define _CRT_SECURE_NO_DEPRECATE
#include <cstdio>
#include <cstring>
#define CH (*s - 'a')
using namespace std;
struct Trie{
int cnt, sons;
Trie *son[26];
Trie(){
cnt = sons = 0;
memset(son, 0, sizeof(son));
}
};
Trie *T = new Trie;
void insert(Trie *&node, char *s){
if (*s == '\n'){
++node->cnt;
return;
}
if (!node->son[CH]) node->son[CH] = new Trie, ++node->sons;
insert(node->son[CH], s + 1);
}
bool del(Trie *&node, char *s){
if (*s == '\n')
--node->cnt;
else if (del(node->son[CH], s + 1)){ // the son node was deleted
--node->sons;
node->son[CH] = 0;
}
if (!node->sons && node != T && !node->cnt){
delete node;
return 1;
}
return 0;
}
int query(Trie *&node, char *s){
if (*s == '\n') return node->cnt;
if (node->son[CH]) return query(node->son[CH], s + 1);
return 0;
}
int prefix(Trie *&node, char *s, int k){
if (*s == '\n' || !node->son[CH]) return k;
return prefix(node->son[CH], s + 1, k + 1);
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
char line[25];
fgets(line, 25, stdin);
while (line[0]){
switch (line[0]){
case '0': insert(T, line + 2); break;
case '1': del(T, line + 2); break;
case '2': printf("%d\n", query(T, line + 2)); break;
case '3': printf("%d\n", prefix(T, line + 2, 0)); break;
}
line[0] = 0;
fgets(line, 25, stdin);
}
return 0;
}