Cod sursa(job #2362314)

Utilizator marian013Giugioiu Marian Constantin marian013 Data 3 martie 2019 09:59:52
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie{
    int cnt, nrfii;
	Trie *fiu[ 26 ];

	Trie() {
		cnt = nrfii = 0;
		for(int i=0;i<26;i++)
            fiu[i]=0;
	}
};
Trie *t = new Trie;
char S[100];
void ins( Trie *nod, char *s ) {
	if( *s == 0 ) {
		nod->cnt ++; return;
	}

	if( nod->fiu[ *s-'a' ] == 0 ) {
		nod->fiu[ *s-'a' ] = new Trie;
		nod->nrfii ++;
	}

	ins( nod->fiu[ *s-'a' ], s+1 );
}
void afisare(Trie *nod,int poz){
    if(nod->cnt)
    {
        S[poz]=0;
        g<<S<<"\n";
    }
    if(nod->nrfii)
        for(int i=0;i<26;i++)
            if(nod->fiu[i])
            {
                S[poz]=i+'a';
                afisare(nod->fiu[i],poz+1);
            }
}
int que( Trie *nod, char *s ) {
	if( *s == 0)
		return nod->cnt;

	if( nod->fiu[ *s-'a' ] )
		return que( nod->fiu[ *s-'a' ], s+1 );
	return 0;
}
int del(Trie *nod, char *s)
{
    if(*s==0)
        nod->cnt--;
    else if(del(nod->fiu[*s-'a'],s+1))
    {
        nod->fiu[*s-'a']=0;
        nod->nrfii--;
    }
    if(nod->cnt==0&&nod->nrfii==0&&nod!=t)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int pre(Trie *nod, char *s, int k)
{
    if(*s==0||nod->fiu[*s-'a']==0)
        return k;
    return pre(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
    char s[32];
    int x;
	while(f.get(s,32)) {
        f.get();
        switch(s[0])
        {
            case '0':ins(t,s+2);break;
            case '1':del(t,s+2);break;
            case '2':g<<que(t,s+2)<<"\n";break;
            case '3':g<<pre(t,s+2,0)<<"\n";;break;
        }
	}
	//afisare(t,0);
}