Pagini recente » Cod sursa (job #641599) | Cod sursa (job #96682) | Cod sursa (job #1743235) | Cod sursa (job #895529) | Cod sursa (job #710865)
Cod sursa(job #710865)
#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(nod *curent,int i){
nod *copie;
int poz;
poz=sir[i]-'a';
copie=curent;
curent->nrap--;
if(sir[i+1]==NULL)
curent->nrcuv--;
curent=curent->p[sir[i+1]-'a'];
if(sir[i+1]!=NULL && curent!=NULL){
sterge(curent,i+1);
}
if(curent->nrap==0){
copie->p[poz]=NULL;
delete curent;
}
}*/
void sterge(){
int i=0,poz;
nod *curent,*ant;
curent=root;
ant=root;
while(sir[i]!=NULL && curent!=NULL){
ant=curent;
curent=curent->p[sir[i]-'a'];
poz=sir[i]-'a';
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();
if(opcode==1)
sterge();
if(opcode==2)
aparitii();
if(opcode==3)
prefix();
}
return 0;
}