Pagini recente » Cod sursa (job #254650) | Cod sursa (job #2722150) | Cod sursa (job #319447) | Cod sursa (job #2862651) | Cod sursa (job #921324)
Cod sursa(job #921324)
#include<cstdio>
#include<cassert>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<string>
#include<fstream>
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(){
ifstream in("trie.in");
ofstream out("trie.out");
nod vid;
trie.push_back(vid);
int tip;
while(in >> tip){
in >> x;
if(tip == 0)
update(1);
if(tip == 1)
update(-1);
if(tip == 2)
out << query() << "\n";
if(tip == 3)
out << query2() << "\n";
}
return 0;
}