Cod sursa(job #2180636)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 20 martie 2018 23:56:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <bits/stdc++.h>

using namespace std;

const int NMax = 33;
const int SIGMA = 30;

ifstream f("trie.in");
ofstream g("trie.out");

struct TRIE{
    int value;
    int prefix;
    struct TRIE *edges[SIGMA];
};

char y[NMax];
char *p;
int x;
TRIE *root;

void add_trie(TRIE *node){
    char edge = *p - 'a';
    if(node != root){
        node->prefix++;
    }
    if(*p == 0){
        node->value++;
        return;
    }
    if(!node->edges[edge]){
        TRIE *aux;
        aux = new TRIE;
        aux->value = 0;
        for(int i = 0; i < SIGMA; ++i){
            aux->edges[i] = NULL;
            aux->prefix = 0;
        }
        node->edges[edge] = aux;
        p++;
        add_trie(node->edges[edge]);
        return;
    }
    p++;
    add_trie(node->edges[edge]);
}
void delete_trie(TRIE *node){
    char edge = *p - 'a';
    if(node != root){
        node->prefix--;
    }
    if(*p == 0){
        node->value--;
        return;
    }
    p++;
    delete_trie(node->edges[edge]);
}
void afisare_trie(TRIE *node){
    char edge = *p - 'a';
    if(*p == 0){
        g << node->value << '\n';
        return;
    }
    if(!node->edges[edge]){
        g << 0 << '\n';
        return;
    }
    p++;
    afisare_trie(node->edges[edge]);
}
void prefix_trie(TRIE *node,int len){
    char edge = *p - 'a';
    if(*p == 0){
        g << len << '\n';
        return;
    }
    if(!node->edges[edge]){
        g << len << '\n';
        return;
    }
    if(node->edges[edge]->prefix < 1){
        g << len << '\n';
        return;
    }

    p++;
    prefix_trie(node->edges[edge], len + 1);
}
int main()
{
    root = new TRIE;
    root->prefix = 2;
    for(int i = 0; i < SIGMA; ++i){
        root->edges[i] = NULL;
    }

    while(f >> x){
        f.getline(y,NMax);
        p = y;
        p++;
        if(x == 0){
            add_trie(root);
        }else
        if(x == 1){
            delete_trie(root);
        }else
        if(x == 2){
            afisare_trie(root);
        }else
        if(x == 3){
            prefix_trie(root,0);
        }
    }
    return 0;
}