Pagini recente » Cod sursa (job #2495144) | Teoria jocurilor: numerele Sprague Grundy | Cod sursa (job #1289074) | Cod sursa (job #1542671) | Cod sursa (job #2092105)
#include <fstream>
#include <cstring>
#define NIL 0
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char cuv[25];
int delta;
struct trie {
int cnt = 0, nrs = 0;
trie *fiu[27];
trie() {
cnt = nrs = 0;
memset(fiu, 0, sizeof(fiu));
}
};
trie *root = new trie();
inline void Add(trie *node, char *s) {
if (*s == 0) {
node->cnt++;
return;
}
int delta = *s - 'a';
if (node->fiu[delta] == NIL) {
node->nrs++;
node->fiu[delta] = new trie();
}
Add(node->fiu[delta], s + 1);
}
inline int Delete(trie *node, char *s) {
if (*s == 0) {
node->cnt--;
if (node->cnt == 0 && node->nrs == 0 && node != root) {
delete node;
return 1;
}
return 0;
}
int delta = *s - 'a';
if (Delete(node->fiu[delta], s + 1)) {
node->fiu[delta] = 0;
node->nrs--;
if (node->nrs == 0 && node->cnt == 0 && node != root) {
delete node;
return 1;
}
}
return 0;
}
inline int Query(trie *node, char *s) {
if (*s == 0) {
return node->cnt;
}
int delta = *s - 'a';
if (node->fiu[delta] == NIL)
return 0;
return Query(node->fiu[delta], s + 1);
}
inline int Prefix(trie *node, char *s) {
if (*s == 0)
return 0;
delta = *s - 'a';
if (node->fiu[delta] != NIL) {
return Prefix(node->fiu[delta], s + 1) + 1;
}
return 0;
}
inline void Read() {
int tip;
fin >> tip >> cuv;
while (!fin.eof()) {
if (tip == 0) {
Add(root, cuv);
}
else if (tip == 1) {
int aux = Delete(root, cuv);
}
else if (tip == 2) {
fout << Query(root, cuv) << "\n";
}
else {
fout << Prefix(root, cuv) << "\n";
}
fin >> tip >> cuv;
}
}
int main () {
Read();
fin.close(); fout.close(); return 0;
}