Pagini recente » Cod sursa (job #1825842) | Cod sursa (job #1825463) | Cod sursa (job #2936133) | Cod sursa (job #699306) | Cod sursa (job #921270)
Cod sursa(job #921270)
#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;
void update(string x, 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(string x){
int start = 0;
for(int i = 0; i < x.size(); ++i)
start = trie[start].neib[x[i] - 'a'];
return trie[start].val;
}
int query2(string x){
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;
string xtra;
while(cin >> tip){
cin >> xtra;
if(tip == 0)
update(xtra, 1);
if(tip == 1)
update(xtra, -1);
if(tip == 2)
cout << query(xtra) << "\n";
if(tip == 3)
cout << query2(xtra) << "\n";
}
return 0;
}