Cod sursa(job #1189032)

Utilizator Ionut228Ionut Calofir Ionut228 Data 21 mai 2014 09:10:13
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <cstring>
#include <iostream>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

char line[27];

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

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

void ins(Trie *nod, char *s)
{
    if (*s == '\0')
    {
        ++nod->cnt;
        return;
    }

    if (nod->fiu[int(*s - 'a')] == 0)
    {
        nod->fiu[int(*s - 'a')] = new Trie;
        ++nod->nrfii;
    }

    ins(nod->fiu[int(*s - 'a')], s + 1);
}

int del(Trie *nod, char *s)
{
    if (*s == '\0')
        --nod->cnt;
    else if (del(nod->fiu[int(*s - 'a')], s + 1))
    {
        nod->fiu[int(*s - 'a')] = 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 == '\0')
        return nod->cnt;

    if (nod->fiu[int(*s - 'a')])
        return que(nod->fiu[int(*s - 'a')], s + 1);
    return 0;
}

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

int main()
{
    while (fin.getline(line, 27))
    {
        if (int(line[0] - '0') == 0) ins(T, line + 2);
        else if (int(line[0] - '0') == 1) del(T, line + 2);
        else if (int(line[0] - '0') == 2) fout << que(T, line + 2) << '\n';
        else if (int(line[0] - '0') == 3) fout << pre(T, line + 2, 0) << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}