Cod sursa(job #712747)

Utilizator vendettaSalajan Razvan vendetta Data 13 martie 2012 19:18:56
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include <cstdio>
#include <cstring>
#define nmax 200006*26
#define wmax 22
using namespace std;

struct camp{

    int Fiu, Frate, Prefix, Cuvant;
    char c;

}T[nmax];

int rez, L, aux, N=1;
char s[wmax];


void adauga(int st){

    int rad = 1;

    int i , j;

    for(i=st; i<=L; i++){
        int ok = 0;
        for(j=T[rad].Fiu; j; j=T[j].Frate){
            if (s[i] == T[j].c){
                ok = 1;
                ++T[j].Prefix;
                if (j == L) ++T[j].Cuvant;
                rad = j;
                break;
            }
            else aux = j;
        }
        if (ok == 0){
            ++N;
            T[N].c = s[i];
            ++T[N].Prefix;
            if (i == L) ++T[N].Cuvant;
            if (T[rad].Fiu == 0) T[rad].Fiu = N;
                else T[aux].Frate = N;
            rad = N;
        }
    }

}

void sterge(int st){

    int rad = 1;

    for(int i=st; i<=L; i++){
        int ok = 0;
        for(int j=T[rad].Fiu; j; j=T[j].Frate){
            if (s[i] == T[j].c){
                ok = 1;
                --T[j].Prefix;
                if (i == L) --T[j].Cuvant;
                rad = j;
                break;
            }
        }
    }

}

int Ap_cuvant(int st){

    int rad = 1;

    for(int i=st; i<=L; i++){
        int ok = 0;
        for(int j=T[rad].Fiu; j; j = T[j].Frate){
            if (s[i] == T[j].c && T[j].Prefix){//daca nu l`am mai sters !!!
                ok = 1;
                if (i == L) return T[j].Cuvant;
                rad = j;
                break;
            }
        }
        if (ok == 0) return 0;
    }

}

int Lung_max(int st){

    int rad = 1;

    for(int i=st; i<=L; i++){
        int ok = 0;
        for(int j=T[rad].Fiu; j; j=T[j].Frate){
            if (s[i] == T[j].c && T[j].Prefix){
                ok = 1;
                ++rez;
                if (i == L) return rez;
                rad = j;
            }
        }
        if (ok == 0) return rez;
    }

    return rez;

}

int main(){

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

    while ( fgets(s, wmax, stdin) ){
        L = strlen(s) - 2;
        rez = 0;
        if (s[0] == '0') adauga(2);
        else if(s[0] == '1') sterge(2);
        else if(s[0] == '2') printf("%d\n", Ap_cuvant(2));
        else if(s[0] == '3') Lung_max(2), printf("%d\n", rez);
    }

    fclose(stdin);
    fclose(stdout);

    return 0;

}