Pagini recente » Cod sursa (job #322251) | Cod sursa (job #2523508) | Cod sursa (job #943106) | Cod sursa (job #648565) | Cod sursa (job #927611)
Cod sursa(job #927611)
#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
#define Sigma 27
#define ll long long
string S;
struct Trie{
int prefix, cuv;
int fiu[Sigma];
Trie(){
prefix = 0; cuv = 0;
for(int i=0; i<Sigma; ++i) fiu[i] = 0;
}
};
vector<Trie> T;
void baga(int nod, int poz){
if (poz == S.size()){
++T[nod].cuv;
return;
}
int lit = S[poz] - 'a';// vreau sa bag caracterul urent pe muchia nod-> fiu_corespunzator
if (T[nod].fiu[lit] != 0){// are fiu
int fiu = T[nod].fiu[lit];
++T[fiu].prefix;
baga(fiu, poz+1);
}else{
Trie vid; T.push_back(vid);
T[nod].fiu[lit] = T.size()-1;// fac legatura
++T[T.size()-1].prefix;
baga(T.size()-1, poz+1);
}
}
void sterge(int nod, int poz){
if (poz == S.size()){
--T[nod].cuv;
return;
}
int lit = S[poz] - 'a';
int fiu = T[nod].fiu[lit];
--T[fiu].prefix;
sterge(fiu, poz+1);
}
int aparitii(int nod, int poz){
if (poz == S.size()){
return T[nod].cuv;
}
int lit = S[poz] - 'a';
int fiu = T[nod].fiu[lit];
if (T[fiu].prefix != 0)
aparitii(fiu, poz+1);
else return 0;// numai e;
}
int cmlpc(int nod, int poz){
if (poz == S.size()){
return S.size() - 3;// scot alea 2 caractere din fata (tipul si spatiul) si mai scad inca un 1 pt ca e indexat de la 0
}
int lit = S[poz] -'a';
int fiu = T[nod].fiu[lit];
if (T[fiu].prefix==0 || fiu==0){
return poz-3;// scot alea 2 din fata + caracterul curent pe care nu am reusit sa il pun/ + 1 pt ca e
}else cmlpc(fiu, poz+1);
}
void rezolva(){
// il tin ca si vector din stl
getline(f, S);
Trie vid;
T.push_back(vid);//aduag nodul 0;
for(; S.size()!=0;){
//cout << S << "\n";
if (S[0] == '0'){
baga(0, 2);
}else if (S[0] == '1'){
sterge(0, 2);
}else if (S[0] == '2'){
g << aparitii(0, 2) << "\n";
}else {
g << cmlpc(0, 2)+1 << "\n";// e indexat de la 0
}
getline(f, S);
}
}
int main(){
rezolva();
f.close();
g.close();
return 0;
}