Cod sursa(job #1395080)

Utilizator nickulNic Kul nickul Data 20 martie 2015 23:35:37
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<fstream>
#include<vector>
#include<string>

using namespace std;

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

struct nod
{
	vector<size_t> fii;
	size_t aparitii,tata,cuvinte;
}
;

int main()
{
	vector<nod> noduri;
	noduri.resize(2);
	noduri[0].fii.resize(26);
	noduri[1].fii.resize(26);
	noduri[0].aparitii=0;
	noduri[1].aparitii=0;
	noduri[0].cuvinte=0;
	noduri[1].cuvinte=0;
	string cuv,cuv2;
	size_t op,poz,l;
	while(!in.eof())
	{
		poz=1;
		l=0;
		in>>op;
		in>>cuv;
		if(in.good()) switch(op)
		{
		case 0:
			{
				while(cuv.size())
				{
					if(noduri[poz].fii[cuv[0]-'a'])
					{
						poz=noduri[poz].fii[cuv[0]-'a'];
						cuv.erase(0,1);
					}
					else 
					{
						noduri.resize(noduri.size()+1);
						noduri[poz].fii[cuv[0]-'a']=noduri.size()-1;
						noduri[noduri[poz].fii[cuv[0]-'a']].tata=poz;
						poz=noduri[poz].fii[cuv[0]-'a'];
						noduri[poz].fii.resize(26);
						noduri[poz].aparitii=0;
						noduri[poz].cuvinte=0;
						cuv.erase(0,1);
					}
					noduri[poz].aparitii++;
				}
				noduri[poz].cuvinte++;
				break;
			}
		case 1:
			{
				while(cuv.size())
				{
					poz=noduri[poz].fii[cuv[0]-'a'];
					cuv.erase(0,1);
					noduri[poz].aparitii--;
				}
				noduri[poz].cuvinte--;
				break;
			}
		case 2:
			{
				while(cuv.size())
				{
					poz=noduri[poz].fii[cuv[0]-'a'];
					cuv.erase(0,1);
				}
				out<<noduri[poz].cuvinte<<'\n';
				break;
			}
		case 3:
			{
				while(cuv.size())
				{
					if(noduri[poz].fii[cuv[0]-'a']&&noduri[noduri[poz].fii[cuv[0]-'a']].aparitii)
						poz=noduri[poz].fii[cuv[0]-'a'],l++;
					else break;
					cuv.erase(0,1);
				}
				out<<l<<'\n';
				break;
			}
		}
	}
}