Cod sursa(job #1535088)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 24 noiembrie 2015 12:20:59
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXL 30

using namespace std;

char s[MAXL], *p;
int op;

struct nod
{
    int nct, nrfii;
    nod* fiu[30];

    nod(int nr = 0)
    {
        nct = nr;
        nrfii = 0;
        for (int i = 0; i < 30; i++)
            fiu[i] = NULL;
    }
};

nod *root = new nod();

void citire()
{
    p = strtok(s, ",. ;");
    op = atoi(p);
    p = strtok(NULL, ",. ;");
    strcpy(s, p);
}

void insertion(nod *crt = root, int ind = 0)
{
    if (!s[ind])
    {
        crt->nct++;
        return;
    }
    int let = s[ind] - 'a';
    if (crt->fiu[let] == NULL) {
        crt->fiu[let] = new nod();
        crt->nrfii++;
    }
    insertion(crt->fiu[let], ind+1);
}

int deletion(nod *crt = root, int ind = 0)
{
    if (!s[ind])
        crt->nct--;
    else {
        int let = s[ind] - 'a';
        if (deletion(crt->fiu[let], ind+1)) {
            crt->fiu[let] = NULL;
            crt->nrfii--;
        }
    }
    if (crt->nrfii == 0 && crt->nct == 0) {
        delete crt;
        return 1;
    }
    return 0;
}

int numberOfAparitions(nod *crt = root, int ind = 0)
{
    if (!s[ind])
        return crt->nct;
    int let = s[ind] - 'a';
    if (crt->fiu[let] != NULL)
        return numberOfAparitions(crt->fiu[let], ind+1);
    return 0;
}

int bestPrefix(nod *crt = root, int ind = 0)
{
    if (!s[ind])
        return ind;
    int let = s[ind] - 'a';
    if (crt->fiu[let] != NULL)
        return bestPrefix(crt->fiu[let], ind+1);
    return ind;
}

void update()
{
    if (op == 0)
        insertion();
    else if (op == 1)
        deletion();
    else if (op == 2)
        cout << numberOfAparitions() << "\n";
    else if (op == 3)
        cout << bestPrefix() << "\n";
    else
        cerr << "ERROR update\n";
}

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

    while(!feof(stdin)) {
        gets(s);
        if (!s[0]) break;
        citire();
        update();
        memset(s, 0, sizeof(s));
    }
    return 0;
}