Pagini recente » Cod sursa (job #2813080) | Cod sursa (job #551929) | Cod sursa (job #1194150) | Cod sursa (job #3328733) | Cod sursa (job #3347827)
#include <bits/stdc++.h>
using namespace std;
const string NUMEFISIER="trie";
ifstream fin(NUMEFISIER+".in");
ofstream fout(NUMEFISIER+".out");
const int Nrlit='z'-'a'+1;
struct Node{
int nrPrefix,nrCuv;
Node* f[Nrlit];
Node(){
nrPrefix=nrCuv=0;
for(int i=0; i<Nrlit; i++)
f[i]=nullptr;
}
};
class Arbore{
Node* root;
Node* add_rec(char cuv[], Node* node){
if(node==nullptr)
node=new Node();
node->nrPrefix++;
if(cuv[0]=='\0')
node->nrCuv++;
else
node->f[cuv[0]-'a']=add_rec(cuv+1, node->f[cuv[0]-'a']);
return node;
}
Node* remove_rec(char cuv[], Node* node){
node->nrPrefix--;
if(cuv[0]=='\0')
node->nrCuv--;
else
node->f[cuv[0]-'a']=remove_rec(cuv+1, node->f[cuv[0]-'a']);
if(node->nrPrefix==0){
delete node;
node=nullptr;
}
return node;
}
int aparitii_rec(char cuv[], Node* node){
if(node==nullptr) return 0;
if(cuv[0]=='\0')
return node->nrCuv;
return aparitii_rec(cuv+1, node->f[cuv[0]-'a']);
}
int lungimePrefix_rec(char cuv[], Node* node){
if(node==nullptr) return -1;
if(cuv[0]=='\0')
return 0;
return 1+lungimePrefix_rec(cuv+1, node->f[cuv[0]-'a']);
}
public:
Arbore(){
root=nullptr;
}
void add(char cuv[]){
root=add_rec(cuv, root);
}
void remove(char cuv[]){
root=remove_rec(cuv, root);
}
int aparitii(char cuv[]){
return aparitii_rec(cuv, root);
}
int lungimePrefix(char cuv[]){
return lungimePrefix_rec(cuv, root);
}
};
int main()
{
int tip;
char cuv[21];
Arbore arb;
while(fin>>tip>>cuv){
switch(tip)
{
case 0:
arb.add(cuv);
break;
case 1:
arb.remove(cuv);
break;
case 2:
fout<<arb.aparitii(cuv)<<'\n';
break;
case 3:
fout<<arb.lungimePrefix(cuv)<<'\n';
break;
}
}
return 0;
}