Cod sursa(job #1411427)

Utilizator ThomasFMI Suditu Thomas Thomas Data 31 martie 2015 18:28:55
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 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()
    {
        ap = nrfii = 0;
        for(int i=0;i<sigma;++i) T[i] = NULL;
    };
} *root = new trie;

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

void sterge(char cuv[])
{
    int n = strlen(cuv);
    trie *crt = root;
    trie *ant;
    for(int i=0;i<n;++i)
    {
        int poz = cuv[i]-'a';
        crt->nrfii--;
        ant = crt;
        crt = crt->T[poz];
        if(!ant->nrfii) delete ant;
    }
    crt->ap--;
    if(!crt->nrfii && !crt->ap) delete crt;
}

int apar(char cuv[])
{
    int n = strlen(cuv);
    trie *crt = root;
    for(int i=0;i<n;++i)
    {
        int poz = cuv[i]-'a';
        if(crt->T[poz] == NULL) return 0;
        crt = crt->T[poz];
    }
    return crt->ap;
}

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

int main()
{
    int op;
    char cuv[sigma];

    while(f>>op>>cuv)
    {
        if(op == 0) adauga(cuv);
        if(op == 1) sterge(cuv);
        if(op == 2) g<<apar(cuv)<<"\n";
        if(op == 3) g<<pref(cuv)<<"\n";
    }

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