Cod sursa(job #1386195)

Utilizator ThomasFMI Suditu Thomas Thomas Data 12 martie 2015 19:50:57
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 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';
        if(crt->T[poz] == NULL)
        {
            crt->T[poz] = new trie;
            crt->nrfii++;
        }

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

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

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 = crt->T[poz];
    }
    return crt->ap;
}

int pref(char sir[])
{
    //g<<sir<<"\n";
    trie* crt = root;
    int ans=0, poz, n = strlen(sir);
    for(int i=0;i<n;++i)
    {
        //g<<sir[i]<<" -> "<<crt->nrfii<<"\n";
        poz = sir[i]-'a';
        if(crt->nrfii || crt->ap) ans = i;
        if(crt->T[poz]) crt = crt->T[poz];
        else break;
    }

    return ans;
}

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;
}