Cod sursa(job #2478483)

Utilizator kywyPApescu tiGEriu kywy Data 22 octombrie 2019 10:21:27
Problema Trie Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <cstring>
#define CH (*s-'a')
using namespace std;

struct Trie
{
	int ct, nrfii;
	Trie *fiu[26];
	
	Trie()
	{
		ct=nrfii=0;
		memset(fiu, 0, sizeof(fiu));
	}
};

Trie *T=new Trie;

void ins(Trie *nod, char *s)
{
	if(*s=='\n')
	{
		nod->ct++;
		return;
	}
	if(nod->fiu[CH]==0)
	{
		nod->fiu[CH]=new Trie;
		nod->nrfii++;
	}
	
	ins(nod->fiu[CH], s+1);
}

int del(Trie *nod, char *s)
{
	if(*s=='\n')
	{
		nod->ct--;
	}
	else if(del(nod->fiu[CH], s+1))
	{
		nod->fiu[CH]=0;
		nod->nrfii--;
	}
	
	if(nod->ct==0&&nod->nrfii==0&&nod!=T)
	{
		delete nod;
		return 1;
	}
	return 0;
}

int que(Trie *nod, char *s)
{
	if(*s=='\n') return nod->ct;
	if(nod->fiu[CH]) return que(nod->fiu[CH], s+1);
	return 0;
}

int pre(Trie *nod, char *s, int k=0)
{
    if(*s=='\n' || nod->fiu[CH]==0)
    {
        return k;
    }
    return pre(nod->fiu[CH], s+1, ++k);
}

char line[32];
int main()
{	
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
    
    while(!feof(stdin))
    {
        fgets(line, 32, stdin);
        switch(line[0])
        {
            case '0': ins(T, line+2); break;
            case '1': del(T, line+2); break;
            case '2': printf("%d\n", que(T, line+2)); break;
            case '3': printf("%d\n", pre(T, line+2)); break;
        }
    }
}