Cod sursa(job #2241486)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 16 septembrie 2018 02:12:34
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int CHAR = 30;

struct Trie{
	
	int val;
	int cuv;
	Trie *next[CHAR];
};

Trie *T;
Trie *nod;

int n;
char S[CHAR];
void Add();
void Del();
void Query();
void QueryP();

int main() {
	
	int q;
	T = new Trie;
	char x;
	while ( fin >> q) {
		memset(S,0,sizeof(S));
		fin >> x;
		fin >> ( S + 1);
		n = strlen(S + 1);
		//cout << (S+ 1 );
		if ( q == 0) 
			Add();
		else
			if ( q == 1)
				Del();
		else
			if ( q == 2)
				Query();
		else
			QueryP();
	}
}	

void Add() {
		
	nod = T;
	for ( int i = 1; i <= n; ++i) {
			if ( nod -> next[S[i] - 'a'] == nullptr )
				nod -> next[S[i] - 'a'] = new Trie;	
				nod = nod -> next[S[i] - 'a'];
				nod -> val++;
			if ( i == n)
				nod -> cuv++;
			}
	
} 

void Del() {
	
	Trie *cop;
	nod = T;
	for ( int i = 1; i <= n; ++i) {
		cop = nod;
		nod = nod->next[S[i]-'a'];
		nod ->val --;
		if ( nod->val == 0) {
			cop -> next[S[i] -'a'] = nullptr;
			break;
		}
		if ( i == n)
			nod ->cuv--;
		}
		
}

void Query() {
	nod = T;
	for ( int i = 1; i <= n; ++i) {
		nod  = nod->next[S[i] -'a'];
		if ( nod == nullptr)
			break;
	}
	if ( nod == nullptr)
		fout << 0 << "\n";
	else
		fout << nod ->cuv << "\n";
}

void QueryP() {
	nod = T;
	int i = 1;
	while ( nod != nullptr and i <= n){
		nod = nod->next[S[i]-'a'];
		++i;
	}
	fout << i - 1 << "\n"; 
}