Cod sursa(job #927611)

Utilizator vendettaSalajan Razvan vendetta Data 25 martie 2013 21:39:36
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 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
#define Sigma 27
#define ll long long

string S;
struct Trie{
    int prefix, cuv;
    int fiu[Sigma];
    Trie(){
        prefix = 0; cuv = 0;
        for(int i=0; i<Sigma; ++i) fiu[i] = 0;
    }
};
vector<Trie> T;


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

    int lit = S[poz] - 'a';// vreau sa bag caracterul urent pe muchia nod-> fiu_corespunzator
    if (T[nod].fiu[lit] != 0){// are fiu
        int fiu = T[nod].fiu[lit];
        ++T[fiu].prefix;
        baga(fiu, poz+1);
    }else{
        Trie vid; T.push_back(vid);
        T[nod].fiu[lit] = T.size()-1;// fac legatura
        ++T[T.size()-1].prefix;
        baga(T.size()-1, poz+1);
    }

}

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

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

int aparitii(int nod, int poz){
    if (poz == S.size()){
        return T[nod].cuv;
    }

    int lit = S[poz] - 'a';
    int fiu = T[nod].fiu[lit];
    if (T[fiu].prefix != 0)
        aparitii(fiu, poz+1);
    else return 0;// numai e;
}

int cmlpc(int nod, int poz){
    if (poz == S.size()){
        return S.size() - 3;// scot alea 2 caractere din fata (tipul si spatiul) si mai scad inca un 1 pt ca e indexat de la 0
    }

    int lit = S[poz] -'a';
    int fiu = T[nod].fiu[lit];
    if (T[fiu].prefix==0 || fiu==0){
        return poz-3;// scot alea 2 din fata + caracterul curent pe care nu am reusit sa il pun/ + 1 pt ca e
    }else cmlpc(fiu, poz+1);
}

void rezolva(){
    // il tin ca si vector din stl
    getline(f, S);
    Trie vid;
    T.push_back(vid);//aduag nodul 0;
    for(; S.size()!=0;){
        //cout << S << "\n";
        if (S[0] == '0'){
            baga(0, 2);
        }else if (S[0] == '1'){
            sterge(0, 2);
        }else if (S[0] == '2'){
            g << aparitii(0, 2) << "\n";
        }else {
            g << cmlpc(0, 2)+1 << "\n";// e indexat de la 0
        }
        getline(f, S);
    }
}

int main(){
    rezolva();

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

    return 0;
}