Pagini recente » Cod sursa (job #1821029) | Cod sursa (job #388926) | Cod sursa (job #2469861) | Cod sursa (job #2926836) | Cod sursa (job #2628158)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("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 (fin >> operation >> s) {
switch(operation) {
case 0:
ins(T, 0);
break;
case 1:
del(T, 0);
break;
case 2:
fout << ans(T, 0) << "\n";
break;
case 3:
fout << pref(T, 0, 0) << "\n";
break;
}
}
return 0;
}