Cod sursa(job #381547)

Utilizator GotenAmza Catalin Goten Data 10 ianuarie 2010 21:22:38
Problema Trie Scor 75
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream.h>
#include<iostream.h>

int L,a[25],i,t,start[30],j,tt,v[590000][28],k,l,c[25],cc[25],ind;
char s[25];

ifstream f("trie.in");
ofstream g("trie.out");

void adaug()
{
	L=strlen(s);
	for(i=2;i<L;i++)
		a[i-1]=s[i]-96;
	L-=2;
	t=start[a[1]];
	if(t)
	{
		j=1;
		while(t&&j<L)
		{
			v[t][27]++;
			tt=t;
			t=v[t][a[j+1]];
			if(t)
				j++;
		}
		if(j==L)
		{	
			v[t][0]++;
			v[t][27]++;
		}			
		else
		{	
			for(i=j+1;i<=L;i++)
			{
				v[tt][a[i]]=++k;
				v[tt][27]++;
				tt=k;
			}
			v[tt][0]++;
			v[tt][27]++;
		}
	}
	else
	{
		start[a[1]]=++k;
		for(i=2;i<=L;i++)
		{
			v[k][27]++;
			v[k][a[i]]=k+1;
			k++;
		}
		v[k][0]++;
		v[k][27]++;
	}
}

void sterg()
{
	L=strlen(s);
	for(i=2;i<L;i++)
		a[i-1]=s[i]-96;
	L-=2;
	t=start[a[1]];
	j=1;
	while(j<L)
	{
		if(v[t][27]>0)
			v[t][27]--;
		t=v[t][a[++j]];
	}
	v[t][0]--;
	if(v[t][27]>0)
		v[t][27]--;
}

void aparitii()
{
	L=strlen(s);
	for(i=2;i<L;i++)
		a[i-1]=s[i]-96;
	L-=2;
	t=start[a[1]];
	if(!t)
		g<<"0\n";
	else
	{
		j=1;
		while(t&&j<L)
			t=v[t][a[++j]];
		g<<v[t][0]<<'\n';			
	}
}

void prefix()
{
	L=strlen(s);
	for(i=2;i<L;i++)
		a[i-1]=s[i]-96;
	L-=2;
	t=start[a[1]];
	if(!t)
	{
		g<<"0\n";
		return;
	}
	l=0;
	j=1;
	while(t&&j<=L)
	{
		tt=t;
		if(v[t][27])
			l=j;
		t=v[t][a[++j]];
	}
	g<<l<<'\n';	
}
	
int main()
{
	while(!f.eof())
	{
		f.getline(s,25);
		if(strlen(s)>2)
		{
			if(s[0]==48)
				adaug();
			else
				if(s[0]==49)
					sterg();
				else
					if(s[0]==50)
						aparitii();
					else
						prefix();
		}
	}
	return 0;
}