Cod sursa(job #2268477)

Utilizator pistvanPeter Istvan pistvan Data 24 octombrie 2018 20:59:29
Problema Trie Scor 80
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.95 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;
}