Cod sursa(job #2654861)

Utilizator BereaBerendea Andrei Berea Data 2 octombrie 2020 16:06:36
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

struct Trie
{
    Trie *fii[30];
    int nrcuv;
    int nrpref;
    Trie()
    {
        for (int i=0;i<=26;i++)
        {
            fii[i]=nullptr;
            nrcuv=0;
            nrpref=0;
        }
    };
};


Trie *rad = new Trie();

void Add(char T[5000]) {
	int n = strlen(T);
	Trie *aux = rad;
	for ( int i = 0; i < n; ++i) {
	if(aux->fii[T[i]-'a'] == nullptr) {
		aux->fii[T[i]-'a'] = new Trie();
}
aux = aux->fii[T[i]-'a'];
aux->nrpref ++;
if(i == n-1)
	aux->nrcuv++;
}

}
void Erase(char T[5000]) {
	int n = strlen(T);
	Trie*aux = rad;
	for ( int i = 0; i < n; ++i) {
		aux = aux->fii[T[i]-'a'];
		if(aux == nullptr)
return;
aux->nrpref--;
if( i == n-1)
	aux->nrcuv--;

}

}

int Query1(char T[5000]) {
	int n  =strlen(T);
	Trie *aux = rad;
	for ( int  i = 0; i < n; ++i) {
		aux  = aux->fii[T[i]-'a'];
		if(aux == nullptr)
			return 0;
		if(i == n-1)
			return aux -> nrcuv;
}
}

int Query2(char T[5000]) {
	int n = strlen(T);
	Trie *aux = rad;
	int lung = 0;
	for ( int i = 0 ; i < n; ++i) {
		aux = aux->fii[T[i]-'a'];
		if(aux == nullptr)
			return lung;
        if (aux->nrpref>0)
		++lung;
}
return lung;
}

char t[5000];
int main() {
	int x;
	while(fin >> x) {
	fin >> t;
	if(x == 0)
		Add(t);
	if(x == 1)
		Erase(t);
	if(x == 2)
		fout << Query1(t) << "\n";
	if(x == 3)
		fout << Query2(t)<<"\n";
}
}