Cod sursa(job #1164475)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 2 aprilie 2014 09:06:36
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <cstring>

using namespace std;

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

struct nod
{
    int cnt, nrfii;
    nod *fii[26];
    nod()
    {
        cnt = nrfii = 0;
        for (int i = 0; i < 26; ++i)
            fii[i] = NULL;
    }
} *r;


void add (nod *p, char *s);
int del (nod *p, char *s);
int nrap (nod *p, char *s);
int prefix (nod *p, char *s, int lg);

int main()
{
    int cod;
    char s[25];
    r = new nod;
    while (fin >> cod >> s)
    {
        if (cod == 0) add(r,s);
        else if (cod == 1) del(r,s);
        else if (cod == 2) fout << nrap(r,s)<<'\n';
        else if (cod == 3) fout << prefix (r,s, 1) << '\n';
    }
}

void add (nod* p, char *s)
{
    if (*s == '\0')
    {
        ++ p->cnt;
        return;
    }
    else
    {
        if (p->fii[*s-'a'] == NULL)
        {
            nod *q = new nod;
            ++ p->nrfii;
            p->fii[*s-'a'] = q;
        }
    add(p->fii[*s-'a'],s+1);
    }
}
int del (nod* p, char* s)
{
    if (*s == '\0')
        -- p->cnt;
    else
    {
        if (del( p->fii[*s-'a'], s+1))
        {
            -- p->nrfii;
            delete p->fii[*s-'a'];
            p->fii[*s-'a'] = NULL;
        }
    }
    if (p->nrfii == 0) return 1;
        return 0;
}
int nrap (nod *p, char *s)
{
    if (*s == '\0') return p->cnt;
    else
    if (p->fii[*s-'a'] == NULL) return 0;
    return nrap( p->fii[*s-'a'], s+1 );
}
int prefix (nod *p, char *s, int lg)
{
    int rez;
    if (*s == '\0')
        return 0;

    if (p->fii[*s-'a'] != NULL)
    {
        rez = prefix(p->fii[*s-'a'],s+1, lg+1);
        if (p->nrfii > 1) return max(rez, lg);
    }
}