Cod sursa(job #2259924)

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

struct Trie
{
    int nrfii,cuv;
    Trie *urm[30];
    Trie()
    {
        nrfii=0;
        cuv=0;
        for(int i=0;i<26;i++)
        {
            urm[i]=NULL;
        }
    }
};
Trie *Root;
int pozitie(char x)
{
    return x-'a';
}
void adaugare_cuvant(char *s)
{
    Trie *nod=Root;
    int i,litera;
    for(i=0;i<strlen(s);i++)
    {
        litera=pozitie(s[i]);
        if(nod->urm[litera]==NULL)
        {
            nod->urm[litera]=new Trie();
        }
        nod->nrfii++;
        nod=nod->urm[litera];
    }
    nod->cuv++;
}
int nr_aparitii_cuvant(char *s)
{
    Trie *nod=Root;
    int i,litera;
    for(i=0;i<strlen(s);i++)
    {
        litera=pozitie(s[i]);
        if(nod->urm[litera]==NULL)
        {
            return 0;
        }
        nod=nod->urm[litera];
    }
    return nod->cuv;
}
int cel_mai_lung_prefix(char *s)
{
    Trie *nod=Root;
    int i,litera,lg=0;
    for(i=0;i<strlen(s);i++)
    {
        litera=pozitie(s[i]);
        if(nod->urm[litera]==NULL)
        {
            return lg;
        }
        nod=nod->urm[litera];
        lg++;
    }
    return lg;
}
int stergere_cuvant( Trie *nod, char *s ) {
	if( *s == NULL)
		nod->cuv --;
	else if( stergere_cuvant( nod->urm[ pozitie(*s) ], s+1 ) ) {
			nod->urm[ pozitie(*s) ] = 0;
			nod->nrfii --;
		}

	if( nod->cuv == 0 && nod->nrfii == 0 && nod != Root ) {
		delete nod; return 1;
	}
	return 0;
}
int main()
{
    int op;
    char s[30];
    Root=new Trie();
    while(f>>op)
    {
        f>>s;
        if(op==0)
            adaugare_cuvant(s);
        if(op==1)
            stergere_cuvant(Root,s);
        if(op==2)
            g<<nr_aparitii_cuvant(s)<<"\n";
        if(op==3)
            g<<cel_mai_lung_prefix(s)<<"\n";
    }
    return 0;
}