Pagini recente » Cod sursa (job #251665) | Cod sursa (job #1171600) | Cod sursa (job #790578) | Cod sursa (job #2427106) | Cod sursa (job #844011)
Cod sursa(job #844011)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
#define nmax 200005
#define ll long long
#define Sigma 27
struct Trie{
int fiu[Sigma];
int prefix, cuv;
}T[nmax];
string S;
int Tot;
void baga(int nod, int poz){
if (poz == S.size() ) return;
int lit = S[poz]-'a';
if (T[nod].fiu[lit] != 0){
int Fiu = T[nod].fiu[lit];
++T[Fiu].prefix;
if (poz == S.size()-1) ++T[Fiu].cuv;
baga(Fiu, poz+1);
}else {// nu a mai aparut
T[nod].fiu[lit] = ++Tot;
++T[Tot].prefix;
if (poz == S.size()-1) ++T[Tot].cuv;
baga(Tot, poz+1);
}
}
void sterge(int nod, int poz){
if (poz == S.size() ) return;
int lit = S[poz] - 'a';
int Fiu = T[nod].fiu[lit];
--T[Fiu].prefix;
if (poz == S.size()-1) --T[Fiu].cuv;
sterge(Fiu, poz+1);
}
void ap_cuv(int nod, int poz, int &cnt){
if (poz == S.size() ){
cnt = T[nod].cuv;
return;
}
int lit = S[poz] - 'a';
int Fiu = T[nod].fiu[lit];
if (T[Fiu].prefix != 0)
ap_cuv(Fiu, poz+1, cnt);
else {
cnt = 0;
return;
}
}
void max_prefix(int nod, int poz, int &cnt){
if (poz == S.size()) return;
int lit = S[poz] -'a';
int Fiu = T[nod].fiu[lit];
if (Fiu == 0 || T[Fiu].prefix == 0){//daca nu exista sau daca l-am sters;
return;
}else {
++cnt;
max_prefix(Fiu, poz+1, cnt);
}
}
void rezolva(){
for(; getline(f,S)!= NULL; S.clear()){
if (S[0] == '0'){
baga(0, 2);
}else if (S[0] == '1'){
sterge(0, 2);
}else if (S[0] == '2'){
int cnt = 0; ap_cuv(0, 2, cnt);
g << cnt << "\n";
}else if (S[0] == '3'){
int cnt = 0; max_prefix(0, 2, cnt);
g << cnt << "\n";
}
}
}
int main(){
//citeste();
rezolva();
f.close();
g.close();
return 0;
}