Cod sursa(job #1958928)

Utilizator Joystick6208Catalin Topala Joystick6208 Data 8 aprilie 2017 21:20:27
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
using namespace std;

int t;
char cuv[30];

struct trie
{
	int cnt, nrfii;
	trie *fiu[26];

	trie()
	{
		cnt = nrfii = 0;
		for(int i = 0; i < 26; ++i)
			fiu[i] = NULL;
	}
} *rad;

trie *insert(trie *act, char v[])
{
	if(act == NULL)
		act = new trie;
	
	act->cnt++;

	if(v[0] == 0)
	{
		act->nrfii++;
		return act;
	}
	
	act->fiu[v[0] - 'a'] = insert(act->fiu[v[0] - 'a'], v+1);

	return act;
}

trie *erase(trie *act, char v[])
{
	act->cnt--;

	if(v[0] == 0)
	{
		act->nrfii--;

		if(act->cnt == 0)
		{
			delete act;
			act = NULL;
		}

		return act;
	}

	act->fiu[v[0] - 'a'] = erase(act->fiu[v[0] - 'a'], v+1);

	if(act->cnt == 0)
	{
		delete act;
		act = NULL;
	}

	return act;
}

int search(trie *act, char v[])
{
	if(act == NULL)
		return 0;

	if(v[0] == 0)
		return act->nrfii;

	return search(act->fiu[v[0] - 'a'], v+1);
}

int len_pref(trie *act, char v[])
{
	if(act == NULL)
		return -1;

	if(v[0] == 0)
		return 0;

	int val = len_pref(act->fiu[v[0] - 'a'], v+1);

	return 1+val;
}

int main()
{

	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);

	while(scanf("%d ", &t) != EOF)
	{
		gets(cuv);

		if(t == 0)
			rad = insert(rad, cuv);
		else if(t == 1)
			rad = erase(rad, cuv);
		else if(t == 2)
			printf("%d\n", search(rad, cuv));
		else
			printf("%d\n", len_pref(rad, cuv));
	}

	return 0;
}