Pagini recente » Cod sursa (job #2957675) | Cod sursa (job #736148) | Cod sursa (job #1958441) | Cod sursa (job #2041506) | Cod sursa (job #2152863)
#include <fstream>
#include <memory.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
int cnt = 0, nrfii;
trie *fiu[27];
trie() {
cnt = nrfii = 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] == NULL) {
node->nrfii++;
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->nrfii == 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->nrfii--;
if (node->nrfii == 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';
return Query(node->fiu[delta], s + 1);
}
inline int Prefix(trie *node, char *s) {
if (*s == 0)
return 0;
int delta = *s - 'a';
if (node->fiu[delta] != NULL)
return 1 + Prefix(node->fiu[delta], s + 1);
return 0;
}
void Read() {
int tip; char s[24];
fin >> tip >> s;
while (!fin.eof()) {
if (tip == 0) {
Add(root, s);
}
else if (tip == 1)
tip = Delete(root, s);
else if (tip == 2) {
fout << Query(root, s) << "\n";
}
else
fout << Prefix(root, s) << "\n";
fin >> tip >> s;
}
}
int main () {
Read();
fin.close(); fout.close(); return 0;
}