Cod sursa(job #2313629)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 ianuarie 2019 11:33:17
Problema Trie Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include<cstdio>
#include<cstring>
#define C (*s - 'a')
using namespace std;
struct Trie
{
	int cnt,nrfii;
	Trie *fiu[26];
	Trie()
	{
		cnt=nrfii=0,memset(fiu,0,26);
	}
};
Trie *T=new Trie;
void ins(Trie *nod,char *s)
{
	if(*s=='\n')
	{
		nod->cnt++;
		return;
	}
	if(!nod->fiu[C])
	{
		nod->fiu[C]=new Trie;
		nod->nrfii++;
	}
	ins(nod->fiu[C],s+1);
}
int del(Trie *nod,char *s )
{
	if(*s=='\n')
		nod->cnt--;
	else if(del( nod->fiu[C],s+1))
        nod->fiu[C]=0,nod->nrfii--;
	if(!nod->cnt&&!nod->nrfii&&nod!=T)
	{
		delete nod;
		return 1;
	}
	return 0;
}
int que(Trie *nod,char *s)
{
	if(*s=='\n')
		return nod->cnt;
	if(nod->fiu[C])
		return que(nod->fiu[C],s+1);
	return 0;
}
int pre(Trie *nod,char *s,int k)
{
	if(*s=='\n'||!nod->fiu[C])
		return k;
	return pre(nod->fiu[C],s+1,k+1);
}
int main()
{
    char l[24];
	freopen("trie.in","r",stdin),freopen("trie.out","w",stdout),fgets(l,24,stdin);
	while(!feof(stdin))
	{
		switch(l[0])
		{
			case '0':
                ins(T,l+2);
                break;
			case '1':
                del(T,l+2);
                break;
			case '2':
                printf("%d\n",que(T,l+2));
                break;
			case '3':
                printf("%d\n",pre(T,l+2,0));
                break;
		}
		fgets(l,24,stdin);
	}
}