Cod sursa(job #1934234)

Utilizator NuamcontJohn George Nuamcont Data 21 martie 2017 11:54:08
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 3.13 kb
/*
//Varianta neeficienta
#include <cstdio>
#include <cstring>

#define CH (*s - 'a')

using namespace std;

struct Trie {
    int cnt, nrfii;
    Trie *fiu[ 26 ];

    Trie() {
        cnt = nrfii = 0;
        memset( fiu, 0, sizeof( fiu ) );
    }
};

Trie *T = new Trie;

void ins( Trie *nod, char *s ) {
    if( *s == '\n' ) {
        nod->cnt ++; 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->cnt --;
    else if( del( nod->fiu[ CH ], s+1 ) ) {
            nod->fiu[ CH ] = 0;
            nod->nrfii --;
        }

    if( nod->cnt == 0 && nod->nrfii == 0 && nod != T ) {
        delete nod; return 1;
    }
    return 0;
}

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

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

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

int main() {
    char line[ 32 ];

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

    fgets( line, 32, stdin );

    while( !feof( stdin ) ) {
        switch( line[0] ) {
            case '0': ins( T, line+2 ); break;
            case '1': del( T, line+2 ); break;
            case '2': printf( "%d\n", que( T, line+2 ) ); break;
            case '3': printf( "%d\n", pre( T, line+2, 0 ) ); break;
        }

        fgets( line, 32, stdin );
    }
    return 0;
}
*/
//Sursa de 100 de puncte
#include <iostream>
#include<fstream>
#include<cstring>
#define CH (*s - 'a')
using namespace std;
struct nod
{
    int info,nrfii;
    nod *fii[26];
} *rad;
int t;
char s[22];
ifstream f("trie.in");
ofstream g("trie.out");
void adauga(char s[22],nod *r)
{
    if(!s[0])
    {
        r->info++;
        return ;
    }
    if(!r->fii[s[0]-'a']) {
        nod* q=new nod;
        q->info=0;
        q->nrfii=0;
        r->fii[s[0]-'a']=q;
        r->nrfii++;
    }
    adauga(s + 1, r->fii[s[0]-'a']);
}
int sterge(char s[22],nod *r)
{
    /*
    if(!s[0]) r->info--;
    else if(sterge(s+1,r->fii[s[0]-'a']))
    {
        r->fii[s[0]-'a']=0;
        r->nrfii--;
    }
    if(!r->info && !r->nrfii && r!=rad)
    {
        delete r;
        return 1;
    }
    return 0;
    */
}

void aparitii(char s[22],nod*r)
{
    int l=strlen(s);
    for(int i=0; i<l && r != 0; i++)
        r=r->fii[s[i]-'a'];
    if(r==0)
        g<<"0\n";
    else
        g<<r->info<<'\n';
}
void prefix(char s[22], nod* r)
{
    int l=strlen(s),i;
    for(i=0; i<l; i++)
        if(r->fii[s[i]-'a'])
            r=r->fii[s[i]-'a'];
        else break;
    g<<i<<'\n';
}
int main()
{
    rad=new nod;
    rad->info=0;
    rad->nrfii=0;
    while(f>>t)
    {
        f>>s;
        if(t==0) adauga(s, rad);
        else if(t==1) sterge(s,rad);
        else if(t==2) aparitii(s,rad);
        else prefix(s,rad);
    }
    return 0;
}