Cod sursa(job #2701119)

Utilizator Danut200333Dumitru Daniel Danut200333 Data 29 ianuarie 2021 21:21:08
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 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'];
		if(arb[nod].num==0)
			return 0;
	}
	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;
}