Cod sursa(job #577838)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 10 aprilie 2011 17:49:40
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define pb push_back
#define NM 2000001
#define MM 100001
vector<int> a[NM];
char s[MM];
int rez, pas, lung,nrd,p,dep[NM],l[MM],nrcuv[MM];
inline void add(int p,int nod)
{
	int g=a[nod].size();
	bool ok=0;
	for (int i=0; i<g; ++i)
	{
		if (l[a[nod][i]]!=s[p])
			continue;
		ok=1;
		dep[a[nod][i]]=1+dep[nod];
		if (p==lung)
		{
			++nrcuv[a[nod][i]];
			return;
		}
		add(p+1,a[nod][i]);
		
	}
	if (!ok)
	{
		++nrd;
		a[nod].pb(nrd);
		l[nrd]=s[p];
		dep[nrd]=1+dep[nod];
		nrcuv[nrd]=0;
		if (p<lung)
			add(p+1,nrd);
		if (p==lung)
			++nrcuv[a[nod].size()-1];
	}
	
}
inline void sterge(int p, int nod)
{
	int g=a[nod].size();
	bool ok=0;
	for (int i=0; i<g; ++i)
	{
		if (l[a[nod][i]]!=s[p])
			continue;
		sterge(p+1,a[nod][i]);
		if (p==lung)
		{
			if (a[a[nod][i]].size()==0)
			{
				a[a[nod][i]].erase(a[a[nod][i]].begin(),a[a[nod][i]].end());
				a[nod].erase(a[nod].begin()+i);
				--lung;
				return;
			}
			if (nrcuv[a[nod][i]])
				--nrcuv[a[nod][i]];
			
			--lung;
			return;
		}
	}
	
}
inline void tipar(int p, int nod)
{
	int g=a[nod].size();
	
	for (int i=0; i<g; ++i)
	{
		if (rez)
			return;
		if (l[a[nod][i]]!=s[p])
			continue;
		if (p==lung)//am cuvant
		{
			rez=nrcuv[a[nod][i]]+1;
			return;
		}
		tipar(p+1,a[nod][i]);
	}
	
}
inline void prefix(int p, int nod)
{
	int g=a[nod].size();
	bool ok=0;
	for (int i=0; i<g; ++i)
	{
		if (rez)
			return;
		if (l[a[nod][i]]!=s[p])
			continue;
		ok=1;
		
		prefix(p+1,a[nod][i]);
		if (rez)
			return;
		rez=dep[a[nod][i]]+1;
	}
	if (!ok)
		return;
}
inline void citire()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	//fgets(s,MM, stdin);
	while (!feof(stdin))
	{
		p=2;
		
		fgets(s,MM,stdin);
		lung=strlen(s)-2;
		if (s[0]=='0')
		{
			add(p,0);
			
			continue;
		}
		if (s[0]=='1')
		{
			sterge(p,0);
			
			continue;
		}
		if (s[0]=='2')
		{
			rez=0;
			tipar(p,0);
			printf("%d\n",rez-1);
			
			continue;
		}
		if (s[0]=='3')
		{
			rez=0;
			pas=0;
			prefix(p,0);
			printf("%d\n",rez-1);
			
			continue;
		}
		
	}
}
int main()
{
	citire();
	return 0;
}