Cod sursa(job #2261562)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 16 octombrie 2018 13:13:55
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream fin ("trie.in");
ofstream fout ("trie.out");	
 
struct trie
{
	char val;
	int ap;
	vector <int> copii;
} v[200111];
 
int a=0;
 
char ch[333];
 
void add ()
{
	int cn=0,lg=strlen(ch),cp=0;
	for (int i=0; i<v[cn].copii.size(); ++i)
	{
		int cnn=v[cn].copii.at(i);
		if (v[cnn].val==ch[2+cp])
		{
			v[cnn].ap++;
			cn=cnn;
			i=0;
			cp++;
		}
	}
	if (cp+2<lg)
	{
		while (cp+2<lg)
		{
			v[cn].copii.push_back(++a);
			//a+=1;
			v[a].ap+=1;
			v[a].val=ch[cp+2];
			cn=a;
			cp++;
		}
	}
}
 
void delet ()
{
	int cn=0,lg=strlen(ch),cp=0;
	for (int i=0; i<v[cn].copii.size() && cp+2<lg; ++i)
	{
		int cnn=v[cn].copii.at(i);
		if (v
		[cnn].val==ch[2+cp])
		{
			v[cnn].ap--;
			cnn=v[cnn].copii.at(i);
			i=0;
			cp++;
		}
	}
}
 
void apra()
{
	int cn=0,lg=strlen(ch),cp=0,apr,ln;
	for (int i=0; i<v[cn].copii.size() && cp+2<lg; ++i)
	{
		int cnn=v[cn].copii.at(i);
		if (v[cnn].val==ch[2+cp])
		{
			//v[cn].ap++;
			apr=v[cnn].ap;
			ln=cn;
			cn=cnn;
			i=0;
			cp++;
			if (cp==lg-3)
			{
				break;
			}
		}
	}
	int ans=v[ln].ap;
	for (int i=0;i<v[ln].copii.size();++i)
	{
		ans-=v[v[ln].copii.at(i)].ap;
	}
	if (cp==lg-3)
	{
	fout<<ans<<"\n";
	return;
	}
	fout<<0<<"\n";
}
 
void chibrit ()
{
	int cn=0,lg=strlen(ch),cp=0;
	for (int i=0; i<v[cn].copii.size(); ++i)
	{
		if (v[cn].val==ch[2+cp])
		{
			//v[cn].ap++;
			cn=v[cn].copii.at(i);
			i=0;
			cp++;
		}
		else
		{
			if (i==v[cn].copii.size()-1)
			{
				fout<<cp<<"\n";
				return;
			}
		}
	}
	fout<<cp<<"\n";
}
 
int main()
{
	while (fin.getline(ch,30))
	{
		switch (ch[0])
		{
		case '0':
			add();
			break;
		case '1':
			delet();
			break;
		case '2':
			apra();
			break;
		case '3':
			chibrit();
			break;
		}
		//memset(ch,0,30);
	}
	//cout<<v[0].copii.size();
	return 0;
}