Cod sursa(job #2405720)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 14 aprilie 2019 19:55:47
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int Dim = 1000001;
int n,nrmi;
char T[Dim];

struct Trie{
	
	Trie *Next[28];
	int nrcuv,nrpfr;
	Trie() {
		for ( int i = 0; i < 30; ++i)
			Next[i] = nullptr;
		nrcuv = nrpfr = 0;
	};
} *t = new Trie();

void Add(char T[Dim]) {
	
		int n = strlen(T + 1);
		Trie *aux = t;
		for ( int i = 1; i <= n; ++i) {
			if( aux->Next[T[i] - 'a' ] == nullptr) {
				aux->Next[T[i] -'a'] = new Trie();
			}
			aux = aux->Next[T[i] - 'a'];
			aux->nrpfr++;
			if ( i == n)
				aux->nrcuv++;
		} 	
}

void Erase(char T[Dim]) {
	
	int n = strlen(T+1);
	Trie *aux = t;
	for ( int i = 1; i <= n; ++i) {
		
		aux = aux->Next[T[i] - 'a'];
		if ( aux == nullptr)
			return;
		aux->nrpfr--;
		if ( i == n)
			aux->nrcuv--;
	}
}

int Query2(char T[Dim]) {
	
	int n = strlen(T+1);
	Trie *aux = t;
	for ( int i = 1; i <= n; ++i) {
		
		aux = aux->Next[T[i] - 'a'];
		if ( aux == nullptr)
			return 0;
		if ( i == n)
			return aux->nrcuv;
	}
}
int Query3(char T[Dim]) {
	
	int n = strlen(T + 1);
	Trie *aux = t;
	int lung = 0;
	for ( int i = 1; i <= n; ++i) {
			aux = aux->Next[T[i] - 'a'];
			if ( aux == nullptr)
				return lung;
			if (aux->nrpfr > nrmi)
				++lung;
	}
	return lung;
}


int main() {
	int x;
		
	while ( fin >> x ) {
		memset(T,0,sizeof(0));
		fin >> (T + 1);
		if ( x == 0) {
			Add(T);
		}
		else if ( x == 1) {
			Erase(T);
		}
		else if ( x == 2) {
			fout << Query2(T) << "\n";
		}
		else {
			nrmi = 0;
			fout << Query3(T) << "\n";
			}
			}
}