Cod sursa(job #2225866)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 28 iulie 2018 15:06:42
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#pragma GCC optimize("O2")
#include <bits/stdc++.h>

using namespace std;

#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

ifstream fin("/home/mihai/Documents/c++/A/A.in");
ofstream fout("/home/mihai/Documents/c++/A/A.out");

const int N = 1e6;

int k = 0;

struct nod
{
	int apps;
	int prefix;
	int abc ['z' - 'a' + 5];
}v[N];


void add(string s)
{
	int nod = 0;
	for(int i = 0; i < s.size(); i++)
	{
		int urm = v[nod].abc[s[i] - 'a'];
		if(!urm)
		{
			urm = ++k;
			v[nod].abc[s[i] - 'a'] = urm;
		}
		v[urm].prefix++;
		nod = urm;
	}
	v[nod].apps++;
}

void del(string s)
{
	int nod = 0;
	for(int i = 0; i < s.size(); i++)
	{
		int urm = v[nod].abc[s[i] - 'a'];
		v[urm].prefix--;
		nod = urm;
	}
	v[nod].apps--;
}

void print_apps(string s)
{
	int nod = 0;
	for(int i = 0; i < s.size(); i++)
	{
		int urm = v[nod].abc[s[i] - 'a'];
		if(!v[urm].prefix)
		{
			fout << 0 << '\n';
			return ;
		}
		nod = urm;
	}
	fout << v[nod].apps << '\n';
}

void print_prefix(string s)
{
	int nod = 0;
	for(int i = 0; i < s.size(); i++)
	{
		int urm = v[nod].abc[s[i] - 'a'];
		if(!v[urm].prefix)
		{
			fout << i << '\n';
			return ;
		}
		nod = urm;
	}
	fout << s.size() << '\n';
}

main()
{
	IOS
	int op;
	string s;
	while(fin >> op)
	{
		fin >> s;
		switch(op)
		{
			case 0: add(s); break;
			case 1: del(s); break;
			case 2: print_apps(s); break;
			case 3: print_prefix(s); break;
		}
	}
}