Cod sursa(job #2259862)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 13 octombrie 2018 20:58:34
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

struct Trie
{
    int nr;
    Trie *urm[27];
    Trie()
    {
        nr=0;
        for(int i=0;i<26;i++)
        {
            urm[i]=NULL;
        }
    }
};
Trie *Root;
int pozitie(char x)
{
    return x-'a';
}
void adaugare_cuvant(string s)
{
    Trie *nod=Root;
    int i,litera;
    nod->nr++;
    for(i=0;i<int(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(string s)
{
    Trie *nod=Root;
    int i,litera;
    for(i=0;i<int(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(string s)
{
    Trie *nod=Root;
    int i=0,lg=0,litera;
    for(i=0;i<int(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(string s)
{
    Trie *nod=Root;
    int i,litera;
    nod->nr--;
    for(i=0;i<int(s.size());i++)
    {
        litera=pozitie(s[i]);
        nod=nod->urm[litera];
        nod->nr--;
    }
}
int main()
{
    string s;
    int op;
    Root=new Trie();
    while(f>>op)
    {
        f>>s;
        if(op==0)
            adaugare_cuvant(s);
        if(op==1)
            stergere_cuvant(s);
        if(op==2)
            g<<nr_aparitii_cuvant(s)<<"\n";
        if(op==3)
            g<<cel_mai_lung_prefix(s)<<"\n";
    }
    return 0;
}