Pagini recente » Cod sursa (job #264263) | Cod sursa (job #998942) | Cod sursa (job #2414954) | Cod sursa (job #1240813) | Cod sursa (job #2416151)
#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;
}