Pagini recente » Cod sursa (job #1370212) | Cod sursa (job #1843217) | Cod sursa (job #758916) | Cod sursa (job #1117926)
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
#define ALF 26
struct trie {
int key, nrChild;
trie* next[ALF];
trie() {
nrChild = key = 0;
memset(next, 0, sizeof(next));
}
};
FILE* f = fopen("trie.in", "r");
FILE* g = fopen("trie.out", "w");
trie root;
char buf[25];
void add(trie* node, char* c)
{
while (*c != '\n') {
if (node->next[*c - 'a'] == 0) {
node->next[*c - 'a'] = new trie;
node->nrChild++;
}
node = node->next[*c - 'a'];
c++;
}
node->key++;
}
bool del(trie* node, char* c)
{
if (*c == '\n') {
node->key--;
} else if (del(node->next[*c - 'a'], c + 1) == true) {
node->next[*c - 'a'] = 0;
node->nrChild--;
}
if (node->key == 0 && node->nrChild == 0 && node != &root) {
delete node;
return true;
}
return false;
}
int numAparitions(trie* node, char* c)
{
while (*c != '\n') {
if (node->next[*c - 'a'] == 0) {
return 0;
}
node = node->next[*c - 'a'];
c++;
}
return node->key;
}
int maxPrefix(trie* node, char* c)
{
int nr = 0;
while (*c != '\n' && node->next[*c - 'a'] != 0) {
node = node->next[*c - 'a'];
c++, nr++;
}
return nr;
}
int main()
{
while (fgets(buf, sizeof(buf), f)) {
switch (buf[0]) {
case '0': add(&root, buf + 2); break;
case '1': del(&root, buf + 2); break;
case '2': fprintf(g, "%d\n", numAparitions(&root, buf + 2)); break;
case '3': fprintf(g, "%d\n", maxPrefix(&root, buf + 2)); break;
}
}
fclose(f);
fclose(g);
return 0;
}