Cod sursa(job #2043124)

Utilizator mihnea00Duican Mihnea mihnea00 Data 19 octombrie 2017 17:35:16
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <vector>
#include <queue>
#include <functional>
#include <cstring>

using namespace std;

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

int caz,n,i,p,indx;
char sir[21],c;

struct noduri_si_laturi
{
    int nr,litera[27],coeficientprefix;
} content;

vector<noduri_si_laturi> v;

void adauga(char sir[])
{
    int nivel=0;

    for(int i=0;i<strlen(sir);++i)
    {

        //fout<<sir[i]<<" ";

        if(v[nivel].litera[sir[i]-'a']==0)
        {
            ++indx;
            v.push_back({});
            v[nivel].litera[sir[i]-'a']=indx;
        }
        nivel=v[nivel].litera[sir[i]-'a'];
        v[nivel].coeficientprefix++;

        if(i==strlen(sir)-1)
        {
            v[nivel].nr++;
            return;
        }
    }
    //fout<<"\n";
}

void sterge(char sir[])
{
    int nivel=0;

    for(int i=0;i<strlen(sir);++i)
    {
        nivel=v[nivel].litera[sir[i]-'a'];
        v[nivel].coeficientprefix--;
        if(i==strlen(sir)-1)
        {
            v[nivel].nr--;
            return;
        }
    }
}

int numara_aparitii(char sir[])
{
    int nivel=0;

    for(int i=0;i<strlen(sir);++i)
    {
        nivel=v[nivel].litera[sir[i]-'a'];
        if(nivel==0)
            return 0;
        if(i==strlen(sir)-1)
            return v[nivel].nr;
    }
}

int numara_prefix(char sir[])
{
    int nivel=0;
    int rez=0;

    for(int i=0;i<strlen(sir);++i)
    {
        nivel=v[nivel].litera[sir[i]-'a'];
        if(nivel==0 || v[nivel].coeficientprefix==0)
            return rez;
        rez++;
    }
    return rez;
}

int main()
{
    v.push_back({});

    while(fin>>p>>sir)
    {

        if(p==0)
            adauga(sir);
        if(p==1)
            sterge(sir);
        if(p==2)
            fout<<numara_aparitii(sir)<<"\n";
        if(p==3)
            fout<<numara_prefix(sir)<<"\n";
            //fout<<v[i-1].x<<char(v[i-1].litera)<<"\n";*/
    }

    return 0;
}