Cod sursa(job #2172188)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 15 martie 2018 15:29:56
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie
{
    int val;
    int fin_cuv;
    Trie *v[30];
    Trie()
    {
        val = fin_cuv = 0;
        for(int i=0; i<=29; i++)
            v[i] = 0;
    }
};

Trie *R = new Trie();
Trie *W[30];
Trie *Q = new Trie();
Trie *Aux = new Trie();
int op;
char S[30];
/*
void afiseaza_Trie(Trie *a)
{

    vector<char> stk;
    for(int nr=1; nr<=a->fin_cuv && a->val; nr++)
    {
        for(auto it:stk)
            cout<<it;
        cout<<'\n';
    }
    for(int i=0; i<='z'-'a'; i++)
    {
        if(a->v[i])
        {
            stk.push_back(i+'a');
            afiseaza_Trie(a->v[i]);
        }
    }
    stk.pop_back();
}
*/
void adauga_cuvant(char s[])
{
    int sz = strlen(s);
    Q = R;
    for(int i=0; i<sz; i++)
    {
        if(Q->v[s[i]-'a'] == 0)
        {
            Aux = new Trie();
            Q->v[s[i]-'a'] = Aux;
        }
        Q->val ++;
        Q = Q->v[s[i]-'a'];
    }
    Q->val++;
    Q->fin_cuv++;

}

void sterge_cuvant(char s[])
{
    int sz = strlen(s);
    Q = R;
    for(int i=0; i<sz; i++)
    {
        Q->v[s[i]-'a']->val = max(Q->v[s[i]-'a']->val-1 , 0);
        Q = Q->v[s[i]-'a'];
    }
}

void afiseaza_aparitii(char s[])
{
    int sz=strlen(s);
    Q=R;
    for(int i=0; i<sz; i++)
    {
        if(!Q->v[s[i]-'a'])
        {
            fout<<0<<'\n';
            return;
        }
        Q=Q->v[s[i]-'a'];
    }
    fout<<Q->fin_cuv<<'\n';
}

void cel_mai_lung_prefix(char s[])
{
    int i,sz=strlen(s), sol=0;
    for(i=0, Q=R; i<sz;i++){
        if(Q->v[s[i]-'a'] && Q->v[s[i]-'a']->val)
        {
            sol++;
            Q=Q->v[s[i]-'a'];
        }
        else break;
    }
    fout<<sol<<'\n';
}

int main()
{
    while(fin >> op)
    {
        fin >> S;
        if(op == 0)
            adauga_cuvant(S);
        if(op == 1)
            sterge_cuvant(S);
        if(op == 2)
            afiseaza_aparitii(S);
        if(op == 3)
            cel_mai_lung_prefix(S);
    }
    return 0;
}