Cod sursa(job #953899)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 27 mai 2013 19:41:21
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#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;
}