Cod sursa(job #2466835)

Utilizator Johnny07Savu Ioan-Daniel Johnny07 Data 2 octombrie 2019 23:59:02
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include<fstream>
#include<string>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

struct trie
{
	int nr_cuv_final;
	int nr_cuv_fii;
	trie* fii[27];
	trie()
	{
		for (int i = 0; i <= 26; i++)
			fii[i] = 0;
		nr_cuv_final = 0;
		nr_cuv_fii = 0;
	}
};

trie* root = new trie;

void add(string& s)
{
	int numeric, i, size_s;
	size_s = s.size();
	trie* act = root;

	for (i = 0; i < size_s; i++)
	{
		numeric = s[i] - 97;
		act->nr_cuv_fii++;
		if (act->fii[numeric] == NULL) act->fii[numeric] = new trie;
		act = act->fii[numeric];

	}
	act->nr_cuv_fii++;
	act->nr_cuv_final++;
}

void del(string& s)
{
	int numeric, i, size_s;
	size_s = s.size();
	trie* act = root;
	for (i = 0; i < size_s; i++)
	{
		numeric = s[i] - 97;
		act->nr_cuv_fii--;
		act = act->fii[numeric];
	}
	i--;
	act->nr_cuv_fii--;
	act->nr_cuv_final--;
}

void find(string& s)
{
	int numeric, i, size_s;
	size_s = s.size();
	trie* act = root;
	for (i = 0; i < size_s; i++)
	{
		numeric = s[i] - 97;
		if (act->fii[numeric] == NULL)
		{
			g << 0 << "\n";
			return;
		}
		act = act->fii[numeric];
	}
	g << act->nr_cuv_final << "\n";
}

void prefix(string& s)
{
	int numeric, i, size_s;
	size_s = s.size();
	trie* act = root;
	for (i = 0; i < size_s; i++)
	{
		numeric = s[i] - 97;
		if (act->fii[numeric] == NULL)
		{
			g << i << "\n";
			return;
		}
		if (act->fii[numeric]->nr_cuv_fii == 0)
		{
			g << i << "\n";
			return;
		}
		act = act->fii[numeric];

	}
	g << size_s << "\n";
}

int main()
{
	string s;
	int c;
	while (f >> c >> s)
	{
		//cout << s.size();
		if (c == 0) add(s);
		if (c == 1) del(s);
		if (c == 2) find(s);
		if (c == 3) prefix(s);
	}

	return 0;
}