Pagini recente » Cod sursa (job #1523762) | Cod sursa (job #2026930) | Cod sursa (job #1174391) | Cod sursa (job #2339673) | Cod sursa (job #2579057)
#include <bits/stdc++.h>
#define MOD 543217
#define INF 2100000000
using namespace std;
const int SMAX = 30;
const int NMAX = 120010;
ifstream fin("trie.in");
ofstream fout("trie.out");
int N, tip, lg, pos, ans;
int cnt[NMAX], add[NMAX];
int tree[27][NMAX];
char s[SMAX], ch[NMAX];
void add_element(int node){
if(pos == lg){
cnt[node]++;
add[node]++;
return;
}
if(tree[s[pos] - 'a' + 1][node]){
pos++;
add_element(tree[s[pos - 1] - 'a' + 1][node]);
if(node != 1)
cnt[node]++;
return;
}
tree[s[pos] - 'a' + 1][node] = N;
N++; pos++;
add_element(N - 1);
if(node != 1)
cnt[node]++;
}
void del_element(int node){
if(pos == lg){
cnt[node]--;
add[node]--;
return;
}
if(tree[s[pos] - 'a' + 1][node] && cnt[tree[s[pos] - 'a' + 1][node]] > 0){
pos++;
del_element(tree[s[pos - 1] - 'a' + 1][node]);
if(node != 1)
cnt[node]--;
}
}
void find_element(int node){
if(pos == lg){
ans = add[node];
return;
}
if(tree[s[pos] - 'a' + 1][node] && cnt[tree[s[pos] - 'a' + 1][node]] > 0){
pos++;
find_element(tree[s[pos - 1] - 'a' + 1][node]);
}
}
void prefix_element(int node){
if(pos == lg)
return;
if(tree[s[pos] - 'a' + 1][node] && cnt[tree[s[pos] - 'a' + 1][node]] > 0){
pos++;
prefix_element(tree[s[pos - 1] - 'a' + 1][node]);
ans++;
}
}
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;
}