Cod sursa(job #2589082)

Utilizator catalintermureTermure Catalin catalintermure Data 25 martie 2020 19:19:24
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream inf("trie.in");
ofstream outf("trie.out");

const int SIGMA = 26;

struct Trie {
    int data;
    int nrfii;
    Trie *fiu[SIGMA];

    Trie() {
        data = 0;
        nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};

Trie* T = new Trie;

void add(Trie *t, char* s) {
    while(*s != 0) {
        if(t->fiu[*s - 'a'] == 0) {
            t->fiu[*s - 'a'] = new Trie;
            t->nrfii++;
        }
        t = t->fiu[*s - 'a'];
        s++;
    }
    t->data++;
}

bool del(Trie *t, char* s) {
    if(*s == 0) {
        t->data--;
    }
    else if(del(t->fiu[*s - 'a'], s + 1)) {
        t->fiu[*s - 'a'] = 0;
        t->nrfii--;
    }
    if(t->data == 0 && t->nrfii == 0 && t != T) {
        delete t;
        return true;
    }
    return false;
}

char cuvt[21];
void afis(Trie* t, int k = 0) {
    for(int i = 0; i < t->data; i++) {
        outf << cuvt << '\n';
    }
    for(int i = 0; i < SIGMA; i++) {
        if(t->fiu[i]) {
            cuvt[k] = i + 'a';
            afis(t->fiu[i], k + 1);
            cuvt[k] = 0;
        }
    }
}

void afisRAW(Trie* t) {
    outf << t->data << '\n';
    for(int i = 0; i < SIGMA; i++) {
        if(t->fiu[i]) {
            outf << (char)(i + 'a') << ' ';
            afisRAW(t->fiu[i]);
        }
    }
    outf << "back \n";
}

char cuv[21];

int getAp(Trie* t, char* s) {
    while(*s != 0) {
        if(t->fiu[*s - 'a'] == 0) {
            return 0;
        }
        t = t->fiu[*s - 'a'];
        s++;
    }
    return t->data;
}

int getPref(Trie *t, char *s) {
    int k = 0;
    while(*s != 0 && t->fiu[*s - 'a'] != 0) {
        t = t->fiu[*s - 'a'];
        s++;
        k++;
    }
    return k;
}

int main() {
    int x;
    while(inf >> x >> cuv) {
        if(x == 0) {
            add(T, cuv);
        }
        else if(x == 1) {
            del(T, cuv);
        }
        else if(x == 2) {
            outf << getAp(T, cuv) << '\n';
        }
        else if(x == 3) {
            outf << getPref(T, cuv) << '\n';
        }
    }
    return 0;
}