Pagini recente » Cod sursa (job #2332024) | Cod sursa (job #2766346) | Cod sursa (job #2567562) | Cod sursa (job #1733410) | Cod sursa (job #2579038)
#include <bits/stdc++.h>
#define MOD 543217
#define INF 2100000000
using namespace std;
const int SMAX = 30;
const int NMAX = 300010;
ifstream fin("trie.in");
ofstream fout("trie.out");
int N, tip, lg, pos, ans;
int cnt[NMAX], add[NMAX];
char s[SMAX], ch[NMAX];
vector <int> tree[NMAX];
void add_element(int node){
if(pos == lg){
cnt[node]++;
add[node]++;
return;
}
for(int i = 0; i < tree[node].size(); i++){
int neigh = tree[node][i];
if(ch[neigh] == s[pos] && cnt[neigh]){
pos++;
add_element(neigh);
if(node != 1)
cnt[node]++;
return;
}
}
tree[node].push_back(N);
ch[N] = s[pos];
N++; pos++;
add_element(N - 1);
if(node != 1)
cnt[node]++;
}
void del_element(int node){
if(pos == lg){
cnt[node]--;
add[node]--;
return;
}
for(int i = 0; i < tree[node].size(); i++){
int neigh = tree[node][i];
if(ch[neigh] == s[pos] && cnt[neigh]){
pos++;
del_element(neigh);
if(node != 1)
cnt[node]--;
return;
}
}
}
void find_element(int node){
if(pos == lg){
ans = add[node];
return;
}
for(int i = 0; i < tree[node].size(); i++){
int neigh = tree[node][i];
if(ch[neigh] == s[pos] && cnt[neigh]){
pos++;
find_element(neigh);
return;
}
}
}
void prefix_element(int node){
if(pos == lg)
return;
for(int i = 0; i < tree[node].size(); i++){
int neigh = tree[node][i];
if(ch[neigh] == s[pos] && cnt[neigh]){
pos++;
prefix_element(neigh);
ans++;
return;
}
}
}
int main(){
N = 2; ch[0] = '-';
while(fin >> tip >> s){
lg = strlen(s); pos = 0;
if(tip == 0)
add_element(1);
else if(tip == 1)
del_element(1);
else if(tip == 2){
find_element(1);
fout << ans << '\n';
ans = 0;
} else {
prefix_element(1);
fout << ans << '\n';
ans = 0;
}
}
return 0;
}