Pagini recente » Cod sursa (job #2804430) | Cod sursa (job #2764731) | Cod sursa (job #98859) | Cod sursa (job #2547815) | Cod sursa (job #1117537)
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
#define ALF 27
struct trie {
int key, nrChild;
trie* child[ALF];
trie() {
key = nrChild = 0;
memset(child, 0, sizeof(child));
}
};
FILE* f = fopen("trie.in", "r");
FILE* g = fopen("trie.out", "w");
trie root;
char buf[100];
void add(trie* ptr, char* c)
{
while (*c != '\n') {
if (ptr->child[*c - 'a'] == 0) {
ptr->child[*c - 'a'] = new trie();
ptr->nrChild++;
}
ptr = ptr->child[*c - 'a'];
c++;
}
ptr->key++;
}
int del(trie* ptr, char* c)
{
if (*c == '\n') {
ptr->key--;
} else if (del(ptr->child[*c - 'a'], c + 1)) {
ptr->child[*c - 'a'] = 0;
ptr->nrChild--;
}
if (ptr->key == 0 && ptr->nrChild == 0 && ptr != &root) {
delete ptr;
return 1;
}
return 0;
}
int num(trie* ptr, char* c)
{
while (*c != '\n') {
if (ptr->child[*c - 'a'] == 0) {
return 0;
}
ptr = ptr->child[*c - 'a'];
c++;
}
return ptr->key;
}
int lcp(trie* ptr, char* c) {
int nr = 0;
while (*c != '\n' && ptr->child[*c - 'a']) {
ptr = ptr->child[*c - 'a'];
nr++, c++;
}
return nr;
}
int main()
{
int op, len;
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", num(&root, buf + 2)); break;
case '3': fprintf(g, "%d\n", lcp(&root, buf + 2)); break;
}
}
fclose(f);
fclose(g);
return 0;
}