Pagini recente » Cod sursa (job #780729) | Cod sursa (job #2664717) | Cod sursa (job #2653265) | Istoria paginii runda/oni2015.1112.bv.3 | Cod sursa (job #2642415)
#include<bits/stdc++.h>
#define Nmax 2000100
#define mp make_pair
using namespace std;
int x;
string s;
int cnt[Nmax], ending[Nmax];
int NR = 0;
map<int, int > children;
void insert(int nod, string &s, int ind) {
++cnt[nod];
if(ind == s.size()) {
++ending[nod];
return;
}
if(!children[nod*26 + s[ind] - 'a']) {
children[nod*26 + s[ind] - 'a'] = ++NR;
}
int ch = children[nod*26 + s[ind] - 'a'];
insert(ch, s, ind+1);
}
void del(int nod, string &s, int ind) {
--cnt[nod];
if(ind == s.size()) {
--ending[nod];
return;
}
del(children[nod*26 + s[ind] - 'a'], s, ind+1);
}
int count(int nod, string &s, int ind) {
if(ind == s.size()) {
return ending[nod];
}
if(!children[nod*26 + s[ind] - 'a']) return 0;
return count(children[nod*26 + s[ind] - 'a'], s, ind+1);
}
int lp(int nod, string &s, int ind) {
if(!cnt[nod]) return max(0, ind-1);
if(ind == s.size() || !children[nod*26 + s[ind] - 'a']) {
return ind;
}
return lp(children[nod*26 + s[ind] - 'a'], s, ind+1);
}
int main() {
cin.sync_with_stdio(false);
ifstream fin("trie.in");
ofstream fout("trie.out");
while(fin>>x>>s) {
if(x == 0) insert(0, s, 0);
if(x == 1) del(0, s, 0);
if(x == 2) fout<<count(0, s, 0)<<"\n";
if(x == 3) fout<<lp(0, s, 0)<<"\n";
}
}