Cod sursa(job #2675977)

Utilizator BogdanTicuTicu Bogdan Valeriu BogdanTicu Data 23 noiembrie 2020 07:51:12
Problema Trie Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

using namespace std;

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

struct trie
{
	int num,nrcuv;
	vector<int> v;
	trie()
	{
		num=0;
		nrcuv=0;
		v.resize(27);
	}
};

vector <trie> arb;
int cod;
string s;

void add()
{
	int nod=0;
	for(int i=0;i<s.size();i++)
	{
		if(arb[nod].v[s[i]-'a']==0)
		{
			arb.push_back(trie());
			arb[nod].v[s[i]-'a']=arb.size()-1;
		}
		nod=arb[nod].v[s[i]-'a'];
		arb[nod].num++;
	}
	arb[nod].nrcuv++;
}

void Delete()
{
	int nod=0;
	for(int i=0;i<s.size();i++)
	{
		nod=arb[nod].v[s[i]-'a'];
		arb[nod].num--;
	}
	arb[nod].nrcuv--;
}


int count()
{
	int nod=0;
	for(int i=0;i<s.size();i++)
	{
		nod=arb[nod].v[s[i]-'a'];
	}
	return arb[nod].nrcuv;
}

int lcp()
{
	int nod=0;
	for(int i=0;i<s.size();i++)
	{
		nod=arb[nod].v[s[i]-'a'];
		if(arb[nod].num==0)
			return i;
	}
	return s.size();
}

int main()
{
	arb.push_back(trie());
	while(in>>cod>>s)
	{
		if(cod==0) add();
		else if(cod==1) Delete();
		else if(cod==2) out<<count()<<"\n";
		else out<<lcp()<<"\n";
	}
	return 0;
}