Cod sursa(job #2822946)

Utilizator al3xionescuIonescu Alexandru al3xionescu Data 26 decembrie 2021 14:36:08
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie {
	int nr_cuvinte, nr_fii;
	Trie *fiu[26];
	Trie() {
		nr_cuvinte = nr_fii = 0;
		memset(fiu, 0, sizeof(fiu));
	}
};
Trie *T = new Trie;
string s;
void ins (Trie *nod, int pos) {
	if (pos == s.size()) {
		nod -> nr_cuvinte++;
		return;
	}
	if (nod -> fiu[s[pos] - 'a'] == 0) {
		nod -> fiu[s[pos] - 'a'] = new Trie;
		nod -> nr_fii++;
	}
	ins(nod -> fiu[s[pos] - 'a'], pos + 1);
}
int del (Trie *nod, int pos) {
	if (pos == s.size()) {
		nod -> nr_cuvinte--;
	}
	else 
		if (del(nod -> fiu[s[pos] - 'a'], pos + 1)) {
			nod -> nr_fii--;
			nod -> fiu[s[pos] - 'a'] = 0;
		}
		if (nod -> nr_fii == 0 && nod -> nr_cuvinte == 0 && nod != T) {
			delete nod; return 1;
		}
		return 0;
}
int ans(Trie *nod, int pos) {
	if (pos == s.size()) {
		return nod -> nr_cuvinte;
	}
		if (nod -> fiu[s[pos] - 'a'] == 0)
			return 0;
		return ans(nod -> fiu[s[pos] - 'a'], pos + 1);
}
int pref(Trie *nod, int pos, int len) {
	if (pos == s.size() || nod -> fiu[s[pos] - 'a'] == 0)
		return len;
	return pref(nod -> fiu[s[pos] - 'a'], pos + 1, len + 1);
}
int main() {
	int operation;
	while (in >> operation >> s) {
		switch(operation) {
			case 0 : {
				ins(T, 0);
				break;
			}
			case 1 : {
				del(T, 0);
				break;
			}
			case 2 : {
				out << ans(T, 0) << "\n";
				break;
			}
			case 3 : {
				out << pref(T, 0, 0) << "\n";
				break;
			}
		}
	}
	return 0;
}