Cod sursa(job #2268465)

Utilizator pistvanPeter Istvan pistvan Data 24 octombrie 2018 20:46:42
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <iostream>

#include <fstream>

using namespace std;

ifstream f("trie.in");

ofstream g("trie.out");



struct Trie

{

    int nr;

    Trie *urm[30];

    Trie()

    {

        nr=0;

        for(int i=0;i<26;i++)

        {

            urm[i]=NULL;

        }

    }

};

Trie *Root,*nod,*p;

int op;

string s;

int pozitie(char x)

{

    return x-'a';

}

void adaugare_cuvant()

{

    nod=Root;

    int i,litera;

    nod->nr++;

    for(i=0;i<s.size();i++)

    {

        litera=pozitie(s[i]);

        if(nod->urm[litera]==NULL)

        {

            nod->urm[litera]=new Trie();

        }

        nod=nod->urm[litera];

        nod->nr++;

    }

}

int nr_aparitii_cuvant()

{

    nod=Root;

    int i,litera;

    for(i=0;i<s.size();i++)

    {

        litera=pozitie(s[i]);

        if(nod->urm[litera]==NULL)

        {

            return 0;

        }

        nod=nod->urm[litera];

    }

    int inplus=0;

    for(i=0;i<26;i++)

    {

        if(nod->urm[i]!=NULL)

        {

            inplus=inplus+nod->urm[i]->nr;

        }

    }

    return nod->nr-inplus;

}

int cel_mai_lung_prefix()

{

    nod=Root;

    int i=0,lg=0,litera;

    for(i=0;i<s.size();i++)

    {

        litera=pozitie(s[i]);

        if(nod->urm[litera]==NULL || nod->urm[litera]->nr==0)

        {

            return lg;

        }

        lg++;

        nod=nod->urm[litera];

    }

    return lg;

}

void stergere_cuvant()

{

    nod=Root;

    int i,litera;

    nod->nr--;

    for(i=0;i<s.size();i++)

    {

        litera=pozitie(s[i]);

        nod=nod->urm[litera];

        nod->nr--;

    }

}

int main()

{

    Root=new Trie();

    while(f>>op)

    {

        f>>s;

        cout<<op<<" "<<s<<"\n";

        if(op==0)

            adaugare_cuvant();

        if(op==1)

            stergere_cuvant();

        if(op==2)

            g<<nr_aparitii_cuvant()<<"\n";

        if(op==3)

            g<<cel_mai_lung_prefix()<<"\n";

    }

    return 0;

}