Cod sursa(job #714177)

Utilizator marius135Dumitran Adrian Marius marius135 Data 15 martie 2012 14:57:55
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.06 kb
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<vector>

using namespace std;

struct nod_trie{
    int nr_ap;
    int nr_el_sub;
    int vec[26];
    int tata;
    char lit_tata;
    bool sters;
    nod_trie(){
        nr_ap = 0;
        nr_el_sub = 0;
        sters = false;
        memset(vec, 0, sizeof(vec));
    }

};
vector <nod_trie> noduri;
vector <int> de_sters;

void add(const char cuv[22]) {
    int len_cuv = strlen(cuv);
    int start = 1;
    for( int i = 0; i < len_cuv; ++i) { 
        if( noduri[start].vec[cuv[i]-'a'] == 0) {
            nod_trie a;
            int element;
            if( de_sters.size() != 0 ) {
                element = de_sters.back();
                de_sters.pop_back();
                noduri[element] = a;
            }
            else {
                noduri.push_back(a);
                element = noduri.size() - 1;
            }
            noduri[start].vec[cuv[i]-'a'] = element;
            noduri[element].tata = start;
            noduri[element].lit_tata = cuv[i];
        }
        noduri[start].nr_el_sub++;
        start = noduri[start].vec[cuv[i]-'a'];
    }
    noduri[start].nr_ap++;
   
}
void sterge( int nr_nod) {
    if( nr_nod == 1) return ;
    de_sters.push_back(nr_nod);
    noduri[nr_nod].sters = true;
    int tatal = noduri[nr_nod].tata;
    noduri[tatal].vec[noduri[nr_nod].lit_tata-'a'] = 0;
}

void remove2(const char cuv[22]) {
    int len_cuv = strlen(cuv);
    int start = 1;
    for( int i = 0; i < len_cuv; ++i) {
        noduri[start].nr_el_sub--;
        if( noduri[start].nr_el_sub == 0 && noduri[start].nr_ap == 0)    
            sterge(start);
        start = noduri[start].vec[cuv[i]-'a'];
    }
    noduri[start].nr_ap--;
    
    if( noduri[start].nr_el_sub == 0 && noduri[start].nr_ap == 0) 
        sterge(start);
    
}
int nr_op(const char cuv[22]) {
    int len_cuv = strlen(cuv);
    int start = 1;
    for( int i = 0; i < len_cuv; ++i) {
        if( noduri[start].vec[cuv[i]-'a'] == 0)
            return 0;
        start = noduri[start].vec[cuv[i]-'a'];
    }
    return noduri[start].nr_ap;
}
int prefix(const char cuv[22]) {
    int len_cuv = strlen(cuv);
    int start = 1;
    for( int i = 0; i < len_cuv; ++i) {
        if( noduri[start].vec[cuv[i]-'a'] == 0)
            return i;
        start = noduri[start].vec[cuv[i]-'a'];
        if( noduri[start].sters == true) 
            return i;
        
    }
    return len_cuv;
}

int main() {

    freopen ("trie.in", "r", stdin);
    freopen ("trie.out", "w", stdout);

    int tip_op;
    char cuv[22];
    nod_trie a;
    noduri.push_back(a);
    noduri.push_back(a);
    while( scanf("%d %s", &tip_op, &cuv) == 2)  {
        if( tip_op == 0) {
            add(cuv);
        }
        if( tip_op == 1) {
            remove2(cuv);
        }
        if( tip_op == 2) {
            printf("%d\n", nr_op(cuv));
        }
        if( tip_op == 3) {
            printf("%d\n", prefix(cuv));
        }
    }


    return 0;
}