Cod sursa(job #2746221)

Utilizator cristia_razvanCristia Razvan cristia_razvan Data 27 aprilie 2021 16:55:20
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define imax INT_MAX
#define llmax LLONG_MAX
#define sz(x) (int((x).size()))
#define start ios_base::sync_with_stdio(false), cin.tie(0)
#define finish fin.close(), fout.close()


using ll = long long;
using uint = unsigned int;

const string filename = "trie";

fstream fin(filename + ".in");
ofstream fout(filename + ".out");

char s[55];

struct Nod
{
	int nr, cnt;
	Nod *fii[26];

	Nod()
	{
		nr = cnt = 0;
		for(int i = 0; i < 26; ++i)
			fii[i] = NULL;
	}	

};

Nod *r = new Nod;


void ins(char c[])
{
	int val;
	Nod *p, *q;
	p = r;
	for(int i = 0; c[i]; ++i)
	{
		val = c[i] - 'a';
		if(p -> fii[val] != NULL)
		{
			p = p -> fii[val];
			p -> cnt++;
		}
		else
		{
			q = new Nod;
			q -> cnt = 1;

			p -> fii[val] = q;
			p = q; 
		}
	}
	p -> nr++;
	p -> cnt++;
}

void dele(char c[])
{
	int val;
	Nod *p;
	p = r;
	for(int i = 0; c[i]; ++i)
	{
		val = c[i] - 'a';
		p = p -> fii[val];
		p -> cnt--;
	}
	p -> nr--;
	p -> cnt--;
}

int nrap(char c[])
{
	int val;
	Nod *p;
	p = r;
	for(int i = 0; c[i]; ++i)
	{
		val = c[i] - 'a';
		if(p -> fii[val] == NULL)
			return 0;
		p = p -> fii[val];
	}
	return p -> nr;
}

int pref(char c[])
{
	int val, ans = 0;
	Nod *p; 
	p = r;
	for(int i = 0; c[i]; ++i)
	{
		val = c[i] - 'a';
		if(p -> fii[val] == NULL)
			return ans;
		p = p -> fii[val];
		if(p -> cnt == 0)
			return ans;
		ans++;
	}
	return ans;
}

int main()
{
	start;


	short op;

	while(fin >> op >> s)
	{
		if(op == 0)
			ins(s);
		else if(op == 1)
			dele(s);
		else if(op == 2)
			fout << nrap(s) << '\n';
		else fout << pref(s) << '\n';
	}

	finish;	
	return 0;	
}