Cod sursa(job #2416151)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 26 aprilie 2019 23:47:49
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXQ = 1e5;
const int SIGMA = 26;

struct trie {
	trie *sons[SIGMA];
	int cnt, cnt2;

	trie() {
		for (int i = 0; i < SIGMA; ++ i) sons[i] = 0;
		cnt = 0;
		cnt2 = 0;
	}
};

string s;
void modif(trie *&nod, int poz, int val) {
	if (poz == s.size()) {
		nod->cnt += val;
		nod->cnt2 += val;
		return;
	}

	nod->cnt2 += val;
	if (!nod->sons[s[poz] - 'a']) nod->sons[s[poz] - 'a'] = new trie();
	modif(nod->sons[s[poz] - 'a'], poz + 1, val);
}

int apar(trie *&nod, int poz) {
	if (poz == s.size())
		return nod->cnt;
	if (!nod->sons[s[poz] - 'a']) return 0;
	return apar(nod->sons[s[poz] - 'a'], poz + 1);
}

int lcp(trie *&nod, int poz) {
	if (poz == s.size()) return poz;
	if (nod->cnt2 == 0) return poz - 1;
	if (nod->sons[s[poz] - 'a'] == 0) return poz;
	lcp(nod->sons[s[poz] - 'a'], poz + 1);
}



int main() {
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);

	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	trie *root = new trie();
	int t;

	while (cin >> t) {
		cin >> s;
		if (t == 0) modif(root, 0, 1);
		if (t == 1) modif(root, 0, -1);
		if (t == 2) cout << apar(root, 0) << '\n';
		if (t == 3) cout << lcp(root, 0) << '\n';
	}

	return 0;
}