Pagini recente » Cod sursa (job #416709) | Cod sursa (job #1803493) | Cod sursa (job #1221235) | Cod sursa (job #809708) | Cod sursa (job #921274)
Cod sursa(job #921274)
#include<cstdio>
#include<cassert>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<string>
using namespace std;
class nod{
public:
int val, inw, neib[28];
nod(){
val = 0;
inw = 0;
memset(neib, 0, sizeof(neib));
}
};
vector<nod> trie;
string x;
void update(int val){
int start = 0;
for(int i = 0; i < x.size(); ++i){
int vec = trie[start].neib[x[i] - 'a'];
if(vec == 0){
nod vid;
trie.push_back(vid);
trie[start].neib[x[i] - 'a'] = trie.size() - 1;
}
start = trie[start].neib[x[i] - 'a'];
trie[start].inw += val;
}
trie[start].val += val;
}
int query(){
int start = 0;
for(int i = 0; i < x.size(); ++i)
start = trie[start].neib[x[i] - 'a'];
return trie[start].val;
}
int query2(){
int start = 0, ans = 0;
for(int i = 0; i < x.size(); ++i){
int vec = trie[start].neib[x[i] - 'a'];
if(vec == 0)
return ans;
start = vec;
if(trie[start].inw)
ans = i + 1;
}
return ans;
}
int main(){
assert(freopen("trie.in", "r", stdin));
assert(freopen("trie.out", "w", stdout));
nod vid;
trie.push_back(vid);
int tip;
while(cin >> tip){
cin >> x;
if(tip == 0)
update(1);
if(tip == 1)
update(-1);
if(tip == 2)
cout << query() << "\n";
if(tip == 3)
cout << query2() << "\n";
}
return 0;
}