Pagini recente » Cod sursa (job #2757951) | Cod sursa (job #1962014) | Cod sursa (job #3280174) | Cod sursa (job #1324307) | Cod sursa (job #3292767)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int SIGMA = 26;
struct trie{
int cate_prefix, aparitii;
unsigned lungime;
trie *urmator[SIGMA] = {};
trie(int marime, bool eRadacina){
lungime = marime;
cate_prefix = aparitii = eRadacina;
}
void creeaza_fiu(int poz){
if(!urmator[poz]){
urmator[poz] = new trie(lungime + 1, 0);
}
}
void adaugare(string sir){
cate_prefix++;
if(lungime == sir.size()){
aparitii++;
return;
}
creeaza_fiu(sir[lungime] - 'a');
urmator[sir[lungime] - 'a']->adaugare(sir);
}
void stergere(string sir){
cate_prefix--;
if(lungime == sir.size()){
aparitii--;
return;
}
if(urmator[sir[lungime] - 'a']){
urmator[sir[lungime] - 'a']->stergere(sir);
if(urmator[sir[lungime] - 'a']->cate_prefix == 0){
urmator[sir[lungime] - 'a'] = nullptr;
}
}
}
int cate_aparitii(string sir){
if(lungime == sir.size()){
return aparitii;
}
if(urmator[sir[lungime] - 'a']){
return urmator[sir[lungime] - 'a']->cate_aparitii(sir);
}
else{
return 0;
}
}
int prefix_maxim(string sir){
if(lungime == sir.size()){
return lungime;
}
if(urmator[sir[lungime] - 'a']){
return urmator[sir[lungime] - 'a']->prefix_maxim(sir);
}
else{
return lungime;
}
}
};
int tip;
string sir;
trie radacina_trie(0, 1);
bool citire_interogare(){
if(fin >> tip){
fin >> sir;
return 1;
}
else{
return 0;
}
}
void rezolvare_interogare(){
if(tip == 0){
radacina_trie.adaugare(sir);
}
else if(tip == 1){
radacina_trie.stergere(sir);
}
else if(tip == 2){
fout << radacina_trie.cate_aparitii(sir) << '\n';
}
else{
fout << radacina_trie.prefix_maxim(sir) << '\n';
}
}
int main(){
while(citire_interogare()){
rezolvare_interogare();
}
return 0;
}