Cod sursa(job #681140)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 16 februarie 2012 17:38:58
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>
#include <string>
#include <stdlib.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

#define MarimeAlfabet 'z' - 'a'
#define c2i(ch) ch - 'a'

typedef struct NOD{
    int nrCuvinteTerminate;
    int nrCuvinteCuAcestPrefix;
    struct NOD* next[MarimeAlfabet];
}NOD;

void initializare_nod(NOD *p)
{
    p = new NOD;
    //p->next = new NOD*[MarimeAlfabet];
}

void insereaza(NOD* T, string s)
{
    unsigned int i;
    NOD *q, *p;
    q = T;
    for (i=0; i<s.length(); i++){
        if (!q->next[c2i(s[i])]){
            p = new NOD;
            for (int j=0; j<MarimeAlfabet; j++) p->next[j] = NULL;
            p->nrCuvinteCuAcestPrefix = 0;
            p->nrCuvinteTerminate = 0;
            q->next[c2i(s[i])] = p;
        }
        q = q->next[c2i(s[i])];
        q->nrCuvinteCuAcestPrefix++;
    }
    q->nrCuvinteTerminate++;
}

void sterge(NOD* T, string s)
{
    unsigned int i;
    NOD *q;
    q = T;
    for (i=0; i<s.length(); i++){
        q = q->next[c2i(s[i])];
        q->nrCuvinteCuAcestPrefix--;
    }
    q->nrCuvinteTerminate--;
}

int NRaparitii(NOD* T, string s)
{
    unsigned int i;
    NOD *q;
    q = T;
    for (i=0; i<s.length(); i++){
        q = q->next[c2i(s[i])];
    }
    return q->nrCuvinteTerminate;
}

int CMLprefix(NOD* T, string s)
{
    unsigned int i;
    NOD *q;
    q = T;
    for (i=0; q && i<s.length() && q->next[c2i(s[i])] && q->next[c2i(s[i])]->nrCuvinteCuAcestPrefix; i++){
        q = q->next[c2i(s[i])];
    }
    return i;
}

int main()
{
    NOD *T;
    T = new NOD;
    for (int i=0; i<MarimeAlfabet; i++) T->next[i] = NULL;
    int c;
    string s;
    f >> c >> s;
    while (!f.eof()){
        if (c==0) insereaza(T,s); else
        if (c==1) sterge(T,s); else
        if (c==2) g << NRaparitii(T,s) << '\n'; else
        if (c==3) g << CMLprefix(T,s) << '\n';
        f >> c >> s;
    }
    return 0;
}