Cod sursa(job #2720515)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 10 martie 2021 22:15:25
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

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

struct Trie {
	int cnt, nr;
	Trie* fiu[26];
	Trie() {
		cnt = nr = 0;
		for(int i=0;i<26;i++) fiu[i] = 0;
	}
};

char s[26];
Trie* T = new Trie;
int op;

void add(Trie* t, char* s) {
	if(!(*s)) { t->cnt++; return; }
	int ch = *s - 'a';
	if(!t->fiu[ch]) t->nr++, t->fiu[ch] = new Trie;
	add(t->fiu[ch], s + 1);
}

bool del(Trie* t, char* s) {
	int ch = *s - 'a';
	if(!(*s)) t->cnt--;
	else if(del(t->fiu[ch], s + 1)) t->fiu[ch] = 0, t->nr--;
	if(!t->nr and !t->cnt and !(t==T)) { delete t; return 1; }
	return 0;
}

int findApp(Trie* t, char* s) {
	if(!(*s)) return t->cnt;
	int ch = *s - 'a';
	if(t->fiu[ch]) return findApp(t->fiu[ch], s + 1);
	return 0;
}

int longestCommonPrefix(Trie* t, char* s, int l = 0) {
	int ch = *s - 'a';
	if(!(*s) or !t->fiu[ch]) return l;
	return longestCommonPrefix(t->fiu[ch], s + 1, l + 1);
}

void solve() {
	switch(op) {
		case 0:
			add(T, s);
			break;
		case 1:
			del(T, s);
			break;
		case 2:
			fout<<findApp(T, s)<<'\n';
			break;
		case 3:
			fout<<longestCommonPrefix(T, s)<<'\n';
			break;
	}
}

int main() {
	while(fin>>op>>s) solve();
}