Pagini recente » Cod sursa (job #1239900) | Cod sursa (job #63551) | Cod sursa (job #223939) | Cod sursa (job #1580750) | Cod sursa (job #2579026)
#include <bits/stdc++.h>
#define MOD 543217
#define INF 2100000000
using namespace std;
const int SMAX = 30;
const int NMAX = 100010;
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 solDFS(int node){
if(pos == lg){
if(tip == 0) cnt[node]++, add[node]++;
if(tip == 1) cnt[node]--, add[node]--;
if(tip == 2) 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++;
solDFS(neigh);
if(tip == 3)
ans++;
if(node != 1){
if(tip == 0) cnt[node]++;
if(tip == 1) cnt[node]--;
}
return;
}
}
if(tip == 3 || tip == 2) return;
tree[node].push_back(N);
ch[N] = s[pos];
N++; pos++;
solDFS(N - 1);
if(node != 1){
if(tip == 0) cnt[node]++;
if(tip == 1) cnt[node]--;
}
}
int main(){
N = 2; ch[0] = '-';
while(fin >> tip >> s){
lg = strlen(s); pos = 0;
solDFS(1);
if(tip == 3 || tip == 2){
fout << ans << '\n';
ans = 0;
}
}
return 0;
}