Cod sursa(job #681241)

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

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

typedef struct TRIE{
    int nrCuvinteTerminate;
    int nrCuvinteCuAcestPrefix;
    struct TRIE* next[MarimeAlfabet];
    TRIE(){
        nrCuvinteCuAcestPrefix = nrCuvinteTerminate = 0;
        for (int i=0; i<MarimeAlfabet; i++) next[i] = NULL;
    }
}TRIE;

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

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

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

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

int main()
{
    TRIE *T;
    T = new TRIE;
    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;
}