Cod sursa(job #1410042)

Utilizator ThomasFMI Suditu Thomas Thomas Data 30 martie 2015 20:23:26
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <cstring>
using namespace std;

#define sigma 26

ifstream f("trie.in");
ofstream g("trie.out");

struct trie
{
    int ap,nrfii;
    trie* T[sigma];

    trie()
    {
        nrfii = 0;
        ap = 0;
        for(int i=0;i<sigma;++i) T[i] = NULL;
    }

} *root = new trie;

void add(char sir[])
{
    trie* crt = root;
    int poz, n = strlen(sir);
    for(int i=0;i<n;++i)
    {
        poz = sir[i]-'a';
        crt->nrfii++;

        if(crt->T[poz] == NULL) crt->T[poz] = new trie;

        crt = crt->T[poz];
    }
    crt->ap++;
    crt->nrfii++;
}

void del(char sir[])
{
    trie* crt = root;
    int poz, n = strlen(sir);
    for(int i=0;i<n;++i)
    {
        poz = sir[i]-'a';
        if(crt->nrfii > 0) crt->nrfii--;
        crt = crt->T[poz];
    }
    crt->ap--;
    if(crt->nrfii > 0) crt->nrfii--;
}

int frecv(char sir[])
{
    trie* crt = root;
    int poz, n = strlen(sir);
    for(int i=0;i<n;++i)
    {
        poz = sir[i]-'a';
        if(crt->T[poz] && crt->nrfii) crt = crt->T[poz];
        else return 0;
    }
    return crt->ap;
}

int pref(char sir[])
{
    trie* crt = root;
    int poz, n = strlen(sir);
    for(int i=0;i<n;++i)
    {
        poz = sir[i]-'a';
        if(crt->T[poz] && crt->nrfii) crt = crt->T[poz];
        else return i;
    }

    return n;
}

int main()
{
    int op;
    char sir[26];

    while(f>>op>>sir)
    {
        if(op == 0) add(sir);
        if(op == 1) del(sir);
        if(op == 2) g<<frecv(sir)<<"\n";
        if(op == 3) g<<pref(sir)<<"\n";
    }

    f.close();
    g.close();
    return 0;
}