Cod sursa(job #577830)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 10 aprilie 2011 17:43:24
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.59 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],nrcuv[NM];
vector<char>l[NM];
char s[MM];
int rez, pas, lung,nrd,p,dep[NM];
inline void add(int p,int nod)
{
	int g=a[nod].size();
	bool ok=0;
	for (int i=0; i<g; ++i)
	{
		if (l[nod][i]!=s[p])
			continue;
		ok=1;
		dep[a[nod][i]]=1+dep[nod];
		if (p==lung)
		{
			if (l[nod][i]=='e')
				printf("");
			++nrcuv[nod][i];
			return;
		}
		add(p+1,a[nod][i]);
		
	}
	if (!ok)
	{
		++nrd;
		a[nod].pb(nrd);
		l[nod].pb(s[p]);
		dep[nrd]=1+dep[nod];
		nrcuv[nod].pb(0);
		if (p<lung)
			add(p+1,nrd);
		if (p==lung)
		{
			if (l[nod][0]=='e')
				printf("");
			++nrcuv[nod][a[nod].size()-1];
			printf("");
		}
	}
	
}
inline void sterge(int p, int nod)
{
	int g=a[nod].size();
	bool ok=0;
	for (int i=0; i<g; ++i)
	{
		if (l[nod][i]!=s[p])
			continue;
		sterge(p+1,a[nod][i]);
		if (p==lung)
		{
			if (a[a[nod][i]].size()==0)
			{
				l[a[nod][i]].erase(l[a[nod][i]].begin(),l[a[nod][i]].end());
				nrcuv[a[nod][i]].erase(nrcuv[a[nod][i]].begin(),nrcuv[a[nod][i]].end());
				a[a[nod][i]].erase(a[a[nod][i]].begin(),a[a[nod][i]].end());
				l[nod].erase(l[nod].begin()+i);
				nrcuv[nod].erase(nrcuv[nod].begin()+i);
				a[nod].erase(a[nod].begin()+i);
				
				--lung;
				return;
			}
			if (nrcuv[nod][i])
				--nrcuv[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[nod][i]!=s[p])
			continue;
		if (p==lung)//am cuvant
		{
			rez=nrcuv[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[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;
}