Cod sursa(job #1959075)

Utilizator mihai.alphamihai craciun mihai.alpha Data 9 aprilie 2017 01:52:19
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <stdio.h>
#include <string.h>

using namespace std;

FILE *fin = fopen("trie.in", "r"), *fout = fopen("trie.out", "w");

char *s = new char[23];

struct Trie  {
    int cnt, nrfii;
    Trie *fii[26];
    Trie()  {
        cnt = nrfii = 0;
        memset(fii, 0, sizeof(fii));
    }
};

Trie *T = new Trie;

#define ch *s - 'a'//caracterul curent

void adauga(Trie *nod, char *s)  {
    if(*s == '\n')  {
        nod -> cnt++;
        return;
    }
    if((nod -> fii[ch]) == 0)  {
        nod -> fii[ch] = new Trie;
        nod -> nrfii++;
    }
    adauga(nod -> fii[ch], s + 1);
}

bool sterge(Trie *nod, char *s)  {
    if(*s == '\n')
        nod -> cnt--;
    else if(sterge(nod -> fii[ch], s + 1))  {
        nod -> nrfii--;
        nod -> fii[ch] = 0;//il marchezi pentru adaugat
    }
    if(nod -> cnt == 0 && nod -> nrfii == 0 && nod != T)  {
        delete nod;
        return 1;
    }
    return 0;
}

int apar(Trie *nod, char *s)  {
    if(*s == '\n')
        return nod -> cnt;
    if(nod -> fii[ch])  {
        return apar(nod -> fii[ch], s + 1);
    }
    return 0;
}

int tot;

void pref(Trie *nod, char *s)  {
    if(*s == '\n')
        return;
    if(nod -> fii[ch])  {
        tot++;
        pref(nod -> fii[ch], s + 1);
    }
}

int main()  {
    int op;
    fscanf(fin, "%d ", &op);
    fgets(s, 21, fin);
    while(!feof(fin))  {
        switch(op)  {
            case 0://adauga aparitia
            adauga(T, s);
            break;
            case 1://sterge aparitia
            sterge(T, s);
            break;
            case 2://tipareste numarul de aparitii
            fprintf(fout, "%d\n", apar(T, s));
            break;
            case 3://tipareste lungimea celui mai lung prefix comun al aparitiei cu oricare alt cuvant
            tot = 0;
            pref(T, s);
            fprintf(fout, "%d\n", tot);
            break;
        }
        fscanf(fin, "%d ", &op);
        fgets(s, 21, fin);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}