Cod sursa(job #872005)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 5 februarie 2013 17:41:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <cstring>
using namespace std;

struct nod
{
	int cuv, found;
	nod *fiu[26];
}*T;

void init(nod *&T)
{
	T = new nod;
	T->cuv = 0;
	T->found = 0;
	for (int i=0; i<26; ++i)
		T->fiu[i] = NULL;
}

void add(char *S)
{
	int i, n=strlen(S);
	nod *man = T;
	for (i=0; i<n; ++i)
	{
		if (man->fiu[S[i]-'a'] == NULL)
			init(man->fiu[S[i]-'a']);
		man = man->fiu[S[i]-'a'];
		++man->cuv;
	}
	++man->found;
}

void del(char *S)
{
	int i, n=strlen(S);
	nod *man = T;
	for (i=0; i<n; ++i)
	{
		man = man->fiu[S[i]-'a'];
		if (man->cuv)
			--man->cuv;
	}
	--man->found;
}

int count(char *S)
{
	int i, n=strlen(S);
	nod *man = T;
	for (i=0; i<n; ++i)
	{
		man = man->fiu[S[i]-'a'];
		if (man == NULL || !man->cuv)
			return 0;
	}
	return man->found;
}

int common(char *S)
{
	int i, n=strlen(S), cnt=0;
	nod *man = T;
	for (i=0; i<n && man->fiu[S[i]-'a']; ++i)
	{
		man = man->fiu[S[i]-'a'];
		if (!man->cuv) break;
		++cnt;
	}
	return cnt;
}

int main()
{
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	int c; char S[30], *p;
	init(T);
	while (gets(S))
	{
		c = S[0]-'0';
		p = S+2;
		switch (c)
		{
			case 0: add(p); break;
			case 1: del(p); break;
			case 2: printf("%d\n", count(p)); break;
			case 3: printf("%d\n", common(p)); break;
		}
	}
	return 0;
}