Cod sursa(job #2313896)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 ianuarie 2019 16:37:03
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include<fstream>
#include<cstring>
using namespace std;
struct TRIE
{
	char car;
	int NrW,Pref,son,bro;
}Trie[5200026];
char w[25];
int z,o;
void A()
{
	int root = 0, br = 0;
	int leng = strlen (w);
	for (int p = 1; p < leng; ++ p)
	{
		bool find = false;
		for (int nod = Trie[root].son; nod; nod = Trie[nod].bro)
			if (Trie[nod].car == w[p])
			{
				Trie[nod].Pref ++;
				if (p == leng - 1)
				{
					Trie[nod].NrW ++;
					return;
				}
				root = nod;
				find = true;
				break;
			}
			else br = nod;
		if (find) continue;
		Trie[++z].car = w[p];
		if (p == leng - 1) Trie[z].NrW = Trie[z].Pref = 1;
		else Trie[z].NrW = 0, Trie[z].Pref = 1;
		if (! Trie[root].son) Trie[root].son = z;
		else Trie[br].bro = z;
		root = z;
	}
}
void D()
{
	int root = 0, leng = strlen (w);
	for (int i = 1; i < leng; ++ i)
		for (int nod = Trie[root].son; nod; nod = Trie[nod].bro)
			if (Trie[nod].car == w[i])
			{
				Trie[nod].Pref --;
				if (i == leng - 1) Trie[nod].NrW --;
				root = nod;
				break;
			}
}
int C()
{
	int root = 0, leng = strlen (w);
	bool ok = true;
	for (int i = 1; i < leng && ok; ++ i)
	{
		ok = false;
		for (int nod = Trie[root].son; nod; nod = Trie[nod].bro)
			if (Trie[nod].car == w[i] && Trie[nod].Pref)
			{
				if (i == leng - 1) return Trie[nod].NrW;
				root = nod;
				ok = true;
				break;
			}
	}
	return 0;
}
int M()
{
	int res = 0, leng = strlen (w), root = 0;
	bool ok = true;
	for (int i = 1; i < leng && ok; ++ i)
	{
		ok = false;
		for (int nod = Trie[root].son; nod; nod = Trie[nod].bro)
			if (Trie[nod].car == w[i] && Trie[nod].Pref)
			{
				res ++;
				root = nod, ok = true;
				break;
			}
	}
	return res;
}
int main()
{
	ifstream f("trie.in");
	ofstream g("trie.out");
	while(f>>o)
	{
		f.getline(w,25);
		if(!o)
            A();
		else if(o==1)
            D();
		else if(o==2)
            g<<C()<<'\n';
		else
            g<<M()<<'\n';
	}
}