Pagini recente » Cod sursa (job #161211) | Cod sursa (job #2941088) | Cod sursa (job #2423533) | Cod sursa (job #2708852) | Cod sursa (job #3349125)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
// #include <bits/std++.h>
#define in fin
#define out fout
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct node{
int cnt; // cate is FIX eu
int all; // cate is in total cu prefixul eu
node* nx[26];
node(){
cnt = all = 0;
for(int i = 0; i < 26; i++) nx[i] = NULL;
}
};
node* root = new node();
void add_cuvant(node* eu, string cuv, int it){
if(eu->nx[ cuv[it] - 'a' ] == NULL){
eu->nx[ cuv[it] - 'a' ] = new node();
}
eu->all -= eu->nx[ cuv[it] - 'a' ]->all;
if(it == cuv.size()){
eu->cnt++;
eu->all++;
}else add_cuvant(eu->nx[ cuv[it] - 'a' ], cuv, it + 1);
eu->all += eu->nx[ cuv[it] - 'a' ]->all;
}
void elim_cuvant(node* eu, string cuv, int it){
eu->all -= eu->nx[ cuv[it] - 'a' ]->all;
if(it == cuv.size()){
eu->cnt--;
eu->all--;
}else elim_cuvant(eu->nx[ cuv[it] - 'a' ], cuv, it + 1);
eu->all += eu->nx[ cuv[it] - 'a' ]->all;
}
int nr_ap(node* eu, string cuv, int it){
if(eu->nx[ cuv[it] - 'a' ] == NULL){
// eu->nx[ cuv[it] - 'a' ] = new node();
return 0;
}
if(it == cuv.size()){
return eu->cnt;
}else return nr_ap(eu->nx[ cuv[it] - 'a' ], cuv, it + 1);
}
int pref_max(node* eu, string cuv, int it){
if(it != cuv.size() && eu->nx[ cuv[it] - 'a' ] != NULL && eu->nx[ cuv[it] - 'a' ]->all > 0){
return pref_max(eu->nx[ cuv[it] - 'a' ], cuv, it + 1);
}else return it;
}
signed main(){
ios_base::sync_with_stdio(false);
in.tie(NULL);
while(!fin.eof()){
int x; string s; in >> x >> s;
if(x == 0) add_cuvant(root, s, 0);
else if(x == 1) elim_cuvant(root, s, 0);
else if(x == 2) out << nr_ap(root, s, 0) << '\n';
else if(x == 3) out << pref_max(root, s, 0) << '\n';
}
return 0;
}