Cod sursa(job #844011)

Utilizator vendettaSalajan Razvan vendetta Data 28 decembrie 2012 18:27:27
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>

using namespace std;

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

#define nmax 200005
#define ll long long
#define Sigma 27

struct Trie{
    int fiu[Sigma];
    int prefix, cuv;
}T[nmax];

string S;
int Tot;

void baga(int nod, int poz){
    if (poz == S.size() ) return;

    int lit = S[poz]-'a';
    if (T[nod].fiu[lit] != 0){
        int Fiu = T[nod].fiu[lit];
        ++T[Fiu].prefix;
        if (poz == S.size()-1) ++T[Fiu].cuv;
        baga(Fiu, poz+1);
    }else {// nu a mai aparut
        T[nod].fiu[lit] = ++Tot;
        ++T[Tot].prefix;
        if (poz == S.size()-1) ++T[Tot].cuv;
        baga(Tot, poz+1);
    }
}

void sterge(int nod, int poz){
    if (poz == S.size() ) return;

    int lit = S[poz] - 'a';
    int Fiu = T[nod].fiu[lit];
    --T[Fiu].prefix;
    if (poz == S.size()-1) --T[Fiu].cuv;
    sterge(Fiu, poz+1);
}

void ap_cuv(int nod, int poz, int &cnt){
    if (poz == S.size() ){
        cnt = T[nod].cuv;
        return;
    }

    int lit = S[poz] - 'a';
    int Fiu = T[nod].fiu[lit];
    if (T[Fiu].prefix != 0)
        ap_cuv(Fiu, poz+1, cnt);
    else {
        cnt = 0;
        return;
    }
}

void max_prefix(int nod, int poz, int &cnt){
    if (poz == S.size()) return;

    int lit = S[poz] -'a';
    int Fiu = T[nod].fiu[lit];
    if (Fiu == 0 || T[Fiu].prefix == 0){//daca nu exista sau daca l-am sters;
        return;
    }else {
        ++cnt;
        max_prefix(Fiu, poz+1, cnt);
    }
}

void rezolva(){
    for(; getline(f,S)!= NULL; S.clear()){
        if (S[0] == '0'){
            baga(0, 2);
        }else if (S[0] == '1'){
            sterge(0, 2);
        }else if (S[0] == '2'){
            int cnt = 0; ap_cuv(0, 2, cnt);
            g << cnt << "\n";
        }else if (S[0] == '3'){
            int cnt = 0; max_prefix(0, 2, cnt);
            g << cnt << "\n";
        }
    }
}

int main(){
    //citeste();
    rezolva();

    f.close();
    g.close();

    return 0;
}