Cod sursa(job #1475385)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 24 august 2015 01:08:36
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <cstdio>
#include <cstring>
#define CH (*s - 'a')
using namespace std;

struct Trie
{
    int nrfii,nrcuv;
    Trie *fiu[26];
    Trie()
    {
        nrfii=0; nrcuv=0;
        memset( fiu, 0, sizeof( fiu ) );
    }
};

Trie *t=new Trie;
int aparitii,lungime;

int poz(char *s)
{
     return *s-'a';
}

void ins(Trie *nod,char *s)
{
    if(*s=='\n') { nod->nrcuv++; return; }
    if(nod->fiu[CH]==0)
    {
        nod->fiu[CH]=new Trie;
        nod->nrfii++;
    }
    ins(nod->fiu[CH],s+1);
}

int del(Trie *nod,char *s)
{
    if(*s=='\n')
        nod->nrcuv--;
    else if(del(nod->fiu[CH],s+1))
            {
                nod->fiu[CH]=0;
                nod->nrfii--;
            }
   if( nod->nrcuv == 0 && nod->nrfii == 0 && nod != t ) {
        delete nod;
        return 1;
   }
    return 0;
}

/*int del( Trie *nod, char *s ) {
    if( *s == '\n' )
        nod->nrcuv --;
    else if( del( nod->fiu[ CH ], s+1 ) ) {
            nod->fiu[ CH ] = 0;
            nod->nrfii --;
        }

    if( nod->nrcuv == 0 && nod->nrfii == 0 && nod != t ) {
        delete nod; return 1;
    }
    return 0;
}*/

int pref(Trie *nod,char *s,int k)
{
    if(*s=='\n' || nod->fiu[CH]==0) return k;
    else pref(nod->fiu[CH],s+1,k+1);
}

int apar(Trie *nod,char *s)
{
    if(*s=='\n') return nod->nrcuv;

    if(nod->fiu[CH]) return apar(nod->fiu[CH],s+1);

    return 0;
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    char line[25];
    //fgets(line,25,stdin);

    while(!feof(stdin))
    {
        fgets(line,25,stdin);
        //printf("%s",line+2);
        if(line[0]=='0') ins(t,line+2);
        if(line[0]=='1') del(t,line+2);
        if(line[0]=='2') printf("%d\n",apar(t,line+2));
        if(line[0]=='3') printf("%d\n",pref(t,line+2,0));
        //fgets(line,25,stdin);
    }
    fclose(stdin);
    fclose(stdin);
    return 0;
}