Cod sursa(job #1438021)

Utilizator BLz0rDospra Cristian BLz0r Data 18 mai 2015 22:24:29
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <cstdio>
using namespace std;

#define Nmax 22

FILE *f = fopen ( "trie.in", "r" );
FILE *g = fopen ( "trie.out", "w" );

char S[Nmax];
int maxp;

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

    Trie(){
        cnt = finish = 0;
        for ( int i = 0; i < 26; ++i )
            fiu[i] = NULL;
    }
} *T;

void InsertWord ( Trie* Q, int i ){
    Q -> cnt++;
    if ( !S[i] ){
        Q -> finish ++;
        return;
    }

    int CH = S[i] - 'a';

    if ( !Q -> fiu[CH] )
        Q -> fiu[CH] = new Trie;

    InsertWord ( Q -> fiu[CH], i + 1 );
}

void DeleteWord ( Trie* Q, int i ){
    Q -> cnt--;
    if ( !S[i] ){
        Q -> finish--;
        return;
    }

    int CH = S[i] - 'a';

    DeleteWord ( Q -> fiu[CH], i + 1 );
}

void CountAparition ( Trie* Q, int i ){

    if ( !S[i] ){
        fprintf ( g, "%d\n", Q -> finish );
        return;
    }

    int CH = S[i] - 'a';

    if ( !Q -> fiu[CH] ){
        fprintf ( g, "0\n" );
        return;
    }

    CountAparition ( Q -> fiu[CH], i + 1 );
}

void LongestPrefix ( Trie* Q, int i ){

    if ( !S[i] ){
        fprintf ( g, "%d\n", i );
        return;
    }

    int CH = S[i] - 'a';

    if ( !Q -> fiu[CH] ){
        fprintf ( g, "%d\n", i );
        return;
    }

    LongestPrefix ( Q -> fiu[CH], i + 1 );
}


int main(){

    int type;

    T = new Trie;

    while ( fscanf ( f, "%d%*c%s%*c", &type, S ) != EOF ){
        if ( type == 0 ){
            InsertWord ( T, 0 );
            continue;
        }
        if ( type == 1 ){
            DeleteWord ( T, 0 );
            continue;
        }
        if ( type == 2 ){
            CountAparition ( T, 0 );
            continue;
        }
        if ( type == 3 ){
            maxp = 0;
            LongestPrefix ( T, 0 );
        }
    }

    return 0;
}