Cod sursa(job #2269567)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 26 octombrie 2018 10:37:43
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <cstring>
#include <iostream>
#include <string>
 
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];
string S;
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 >> S;
		n = S.size();
		if ( q == 0) 
			Add();
		else
			if ( q == 1)
				Del();
		else
			if ( q == 2)
				Query();
		else
			QueryP();
	}
}	
 
void Add() {
		
	nod = T;
	for ( int i = 0; 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 - 1)
				nod -> cuv++;
			}
	
} 
 
void Del() {
	
	Trie *cop;
	nod = T;
	for ( int i = 0; 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 - 1)
			nod ->cuv--;
		}
		
}
 
void Query() {
	nod = T;
	for ( int i = 0; 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 = 0;
	while ( nod != nullptr and i <= n){
		nod = nod->next[S[i]-'a'];
		++i;
	}
	fout << i - 1 << "\n"; 
}