Pagini recente » Cod sursa (job #732053) | Cod sursa (job #461353) | Cod sursa (job #820123) | Cod sursa (job #1584553) | Cod sursa (job #1223856)
#include <iostream>
#include <fstream>
#include <cstring>
#define sigma 26
#define child nd->son[s[p]-'a']
using namespace std;
int op;
string s;
struct Trie {
int words, family;
Trie *son[sigma];
Trie() {
words = family = 0;
memset(son, 0, sizeof(son));
}
} *T = new Trie;
void add(Trie *nd, int p) {
if(p == s.size()) {
nd->words++;
return;
}
if(child == NULL) {
nd->family++;
child = new Trie;
}
add(child, p+1);
}
bool discard(Trie *nd, int p) {
if(p == s.size()) nd->words--;
else {
if(discard(child, p+1)) {
child = NULL;
nd->family--;
}
}
if(nd->words == 0 && nd->family == 0 && nd != T) {
delete nd;
return true;
}
return false;
}
int frequency(Trie *nd, int p) {
if(p == s.size()) return nd->words;
if(child == NULL) return 0;
return frequency(child, p+1);
}
int prefixes(Trie *nd, int p) { return (p == s.size() || child == NULL? p : prefixes(child, p+1)); }
int main() {
ifstream f("trie.in"); ofstream g("trie.out") while(!f.eof()) {
f>>op>>s;
if(f.eof()) break;
if(op == 0) add(T, 0);
if(op == 1) discard(T, 0);
if(op == 2) g<<frequency(T, 0)<<"\n";
if(op == 3) g<<prefixes(T, 0)<<"\n";
}
return 0;
}