Cod sursa(job #724149)

Utilizator freakingVlad Eu freaking Data 26 martie 2012 11:51:06
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <cstdio>
#include <fstream>
#include <string.h>
#define inn "trie.in"
#define outt "trie.out"
using namespace std;

struct nod
{
    nod *a[26];
    int val;
    bool terminal;
}primul;



void stergere();
void adaugare();
int parcurgere();
int prefix();

ifstream in(inn);
ofstream out(outt);


int main()
{

    int act;
    while(in>>act)
    {
        if(act==0)
            adaugare();
        else if(act==1)
            stergere();
        else if(act==2)
            out<<parcurgere()<<"\n";
        else if(act==3)
            out<<prefix()<<"\n";
    }
}


void adaugare()
{
    nod *no,*curent;
    curent=&primul;
    char t[22];
    int i,tempo;
    in>>t;
    int lung=strlen(t);


    for(i=0;i<lung;++i)
    {
        curent->terminal=0;
        tempo=t[i]-'a';
        if(!(curent->a[tempo]))
        {
            no=new nod;
            curent->a[tempo]=no;
            no->terminal=1;
        }

        curent=curent->a[tempo];

    }
    curent->val++;

}

int parcurgere()
{
    int i;
    nod *curent;
    curent=&primul;
    char t[22];
    bool ok=1;
    int lung;
    in>>t;
    lung=strlen(t);
    int tempo;
    for(i=0;i<lung;i++)
    {
        tempo=t[i]-'a';
        if( !( curent->a[tempo] ) )
        {
            return 0;
        }
        curent=curent->a[tempo] ;
    }
    return curent->val;
}

int prefix()
{
    nod *curent;
    curent=&primul;
    char t[22];
    bool ok=1;
    int lung;
    int i;
    in>>t;
    lung=strlen(t);
    for(i=0;i<lung;i++)
    {
        int tempo=t[i]-'a';
        if( !( curent->a[tempo] )  )
        {
            if(i)
                return i;
            else
                return i;
        }
        curent=curent->a [tempo] ;
    }
    return i-1;

}

void stergere()
{
    nod *no,*curent,*ant;
    curent=&primul;
    ant=&primul;
    char t[22];
    int i,tempo=0,tempoant;
    in>>t;
    int lung=strlen(t);
    for(i=0;i<lung;++i)
    {
        ant=curent;
        tempo=t[i]-'a';
        tempoant=tempo;
        curent=curent->a[tempo];
    }
    curent->val--;
    if(!(curent->val) && (curent->terminal))
    {
        ant->a[tempoant]=NULL;
        delete curent;
    }
    int z=2;
}