Pagini recente » Cod sursa (job #3188046) | Cod sursa (job #869716) | Cod sursa (job #2855645) | Cod sursa (job #1847821) | Cod sursa (job #953899)
Cod sursa(job #953899)
#include <fstream>
#include <string>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
char sir[25];
struct nod{
int nrap,nrcuv;
nod *p[28];
nod(){
nrap=nrcuv=0;
for(int i=0;i<28;i++)
p[i]=0;
}
}*root;
void insereaza(){
int i=0;
nod *curent;
curent=root;
while(sir[i]!=NULL){
if(curent->p[sir[i]-'a']==NULL){
curent->p[sir[i]-'a']=new nod();
curent=curent->p[sir[i]-'a'];
curent->nrap=1;
if(sir[i+1]==NULL)
curent->nrcuv=1;
}
else{
curent=curent->p[sir[i]-'a'];
curent->nrap++;
if(sir[i+1]==NULL)
curent->nrcuv++;
}
++i;
}
}
void sterge(){
int i=0,poz;
nod *curent,*ant;
curent=root;
ant=root;
while(sir[i]!=NULL && curent!=NULL){
ant=curent;
poz=sir[i]-'a';
curent=curent->p[poz];
curent->nrap--;
if(sir[i+1]==NULL)
curent->nrcuv--;
if(curent->nrap==0){
ant->p[poz]=NULL;
}
if(ant->nrap==0 && ant!=root){
delete ant;
}
++i;
}
if(curent->nrap==0 && curent!=root)
delete curent;
}
int aparitii(){
int i=0;
nod *curent;
curent=root;
while(sir[i]!=NULL){
curent=curent->p[sir[i]-'a'];
if(curent==NULL){
out<<"0\n";
return 0;
}
if(sir[i+1]==NULL){
out<<curent->nrcuv<<"\n";
return curent->nrcuv;
}
++i;
}
}
void prefix(){
int i=0;
nod *curent;
curent=root;
while(sir[i]!=NULL){
curent=curent->p[sir[i]-'a'];
if(curent==NULL){
out<<i<<'\n';
return;
}
++i;
}
out<<i<<'\n';
}
int main(){
int opcode;
root=new nod();
while(in>>opcode){
in>>sir;
if(opcode==0){
insereaza();
continue;
}
if(opcode==1){
sterge();
continue;
}
if(opcode==2){
aparitii();
continue;
}
prefix();
}
return 0;
}