Cod sursa(job #670271)

Utilizator lily3Moldovan Liliana lily3 Data 28 ianuarie 2012 19:36:42
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<fstream>
using namespace std;

int i,j,n=0,m=0;
char a[110];
struct trie
{
	char c;
	int fi,fr,cuv,ap;
};
trie v[600010];
void adauga()
{
	int k=0,rad=0,i,j;
	for(i=2;a[i]&&a[i]!='\n';++i)
	{
		for(j=v[rad].fi;j;j=v[j].fr)
			if(v[j].c==a[i])
			{
				++v[j].ap;
				if(!a[i+1]||a[i+1]=='\n')
					++v[j].cuv;
				rad=j;
				break;
			}
			else
				k=j;
			if(!j)
			{
				++n;
				v[n].c=a[i];
				v[n].ap=1;
				if(!a[i+1]||a[i+1]=='\n')
					v[n].cuv=1;
				else
					v[n].cuv=0;
				if(!v[rad].fi)
					v[rad].fi=n;
				else
					v[k].fr=n;
				rad=n;
			}
	}
}
void sterge()
{
	int i,j,rad=0;
	for(i=2;a[i]&&a[i]!='\n';++i)
		for(j=v[rad].fi;j;j=v[j].fr)
			if(a[i]==v[j].c)
			{
				--v[j].ap;
				if(!a[i+1]||a[i+1]=='\n')
					--v[j].cuv;
				rad=j;
				break;
			}
}
int cauta()
{
	int i,j,rad=0;
	for(i=2;a[i]&&a[i]!='\n';++i)
	{
		for(j=v[rad].fi;j;j=v[j].fr)
			if(a[i]==v[j].c&&v[j].ap)
			{
				rad=j;
				if(!a[i+1]||a[i+1]=='\n')
					return v[rad].cuv;
				break;
			}
			if(!j)
				return 0;
	}
	return 0;
}
int prefix()
{
	int rad=0,i,j,nr=0;
	for(i=2;a[i]&&a[i]!='\n';++i)
	{
		for(j=v[rad].fi;j;j=v[j].fr)
			if(a[i]==v[j].c&&v[j].ap)
			{
				++nr,rad=j;
			break;
			}
			if(!j)
				return nr;
	}
	return nr;
}
int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	while(fgets(a,101,stdin))
	{
		if(a[0]=='0')
			adauga();
		if(a[0]=='1')
			sterge();
		if(a[0]=='2')
			printf("%d\n",cauta());
		if(a[0]=='3')
			printf("%d\n",prefix());
	}
	return 0;
}