Cod sursa(job #2092463)

Utilizator flibiaVisanu Cristian flibia Data 21 decembrie 2017 18:31:58
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

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

struct node{
	int nr_cuv;
	int nr_son;
	node *son[27];
	trie(){
		nr_cuv = 0;
		nr_son = 0;
		memset(son, 0, sizeof son);
	}
};

node *root;
char s[22];
int cod;

void baga(node *nod, char *s){
	if(*s == 0){
		nod -> nr_cuv++;
		return;
	}
	if(nod -> son[*s - 'a'] == NULL){
		nod -> nr_son++;
		nod -> son[*s - 'a'] = new node();
	}
	baga(nod -> son[*s - 'a'], s + 1);
}

bool scoate(node *nod, char *s){
	if(*s == 0){
		nod -> nr_cuv--;
		if(nod -> nr_cuv == 0 && nod -> nr_son == 0 && nod != root){
			delete nod;
			return 1;
		}
		return 0;
	}
	if(scoate(nod -> son[*s - 'a'], s + 1) == 1){
		nod -> nr_son--;
		nod -> son[*s - 'a'] = 0;
		if(nod -> nr_cuv == 0 && nod -> nr_son == 0 && nod != root){
			delete nod;
			return 1;
		}
	}
	return 0;
}

int aparitii(node *nod, char *s){
	if(*s == 0)
		return nod -> nr_cuv;
	if(nod -> son[*s - 'a'] == NULL)
		return 0;
	return aparitii(nod -> son[*s - 'a'], s + 1);
}

int prefix(node *nod, char *s){
	if(nod -> son[*s - 'a'] == NULL || *s == 0)
		return 0;
	return 1 + prefix(nod -> son[*s - 'a'], s + 1);
}

int main(){
	root = new node();
	while(in >> cod){
		in >> s;
		if(cod == 0){
			baga(root, s);
			continue;
		}
		if(cod == 1){
			scoate(root, s);
			continue;	
		}
		if(cod == 2){
			out << aparitii(root, s) << '\n';
			continue;
		}
		if(cod == 3){
			out << prefix(root, s) << '\n';
			continue;
		}
	}
	return 0;
}