Pagini recente » Cod sursa (job #1087975) | Cod sursa (job #1655314) | Cod sursa (job #2646702) | Cod sursa (job #436123) | Cod sursa (job #3355691)
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
// fiecare nod tine sfarsit (cate cuvinte termina aici) si treceri (cate cuvinte trec prin nod)
// erase decrementeaza si sterge in lant nodurile care raman complet goale (treceri=0 si sfarsit=0)
struct Nod {
int sfarsit;
int treceri;
Nod *copii[26];
};
int main(){
ifstream fin("trie.in");
ofstream fout("trie.out");
Nod *radacina = new Nod();
int op;
string s;
while(fin>>op>>s){
int len=s.size();
if(op==0){
Nod *p=radacina;
for(int i=0;i<len;i++){
int idx=s[i]-'a';
if(p->copii[idx]==NULL) p->copii[idx]=new Nod();
p=p->copii[idx];
p->treceri++;
}
p->sfarsit++;
}
else if(op==1){
Nod *cale[25];
Nod *p=radacina;
for(int i=0;i<len;i++){
cale[i]=p;
p=p->copii[s[i]-'a'];
p->treceri--;
}
p->sfarsit--;
for(int i=len-1;i>=0;i--){
int idx=s[i]-'a';
Nod *jos=cale[i]->copii[idx];
if(jos->treceri==0 && jos->sfarsit==0){
delete jos;
cale[i]->copii[idx]=NULL;
}
}
}
else if(op==2){
Nod *p=radacina;
int ok=1;
for(int i=0;i<len;i++){
int idx=s[i]-'a';
if(p->copii[idx]==NULL){ ok=0; break; }
p=p->copii[idx];
}
if(ok) fout<<p->sfarsit<<"\n";
else fout<<0<<"\n";
}
else {
Nod *p=radacina;
int lung=0;
for(int i=0;i<len;i++){
int idx=s[i]-'a';
if(p->copii[idx]==NULL) break;
p=p->copii[idx];
lung++;
}
fout<<lung<<"\n";
}
}
return 0;
}