Cod sursa(job #2453228)

Utilizator vlad082002Ciocoiu Vlad vlad082002 Data 2 septembrie 2019 20:41:08
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <iostream>
#include <cstring>
#define ch (*s-'a')
using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

int op;
char cuv[32];

struct trie{
    int nrfii, val;
    trie* fii[26];

    trie() {
        val = nrfii = 0;
        for(int i = 0; i < 26; i++)
            fii[i] = 0;
    }
};
trie *t = new trie;

void Insert(trie *nod, char* s) {
    if(*s == NULL) {
        nod->val++;
        return;
    }

    if(nod->fii[ch] == 0) {
        nod->fii[ch] = new trie;
        nod->nrfii++;
    }

    Insert(nod->fii[ch], s+1);
}

int Delete(trie *nod, char *s) {
    if(*s == NULL)
        nod->val--;
    else if(Delete(nod->fii[ch], s+1)) {
        nod->fii[ch] = 0;
        nod->nrfii--;
    }

    if(nod->val == 0 && nod->nrfii == 0 && nod != t) {
        delete nod;
        return 1;
    }

    return 0;
}

int nrCuv(trie *nod, char *s) {
    if(*s == NULL)
        return nod->val;
    if(nod->fii[ch])
        return nrCuv(nod->fii[ch], s+1);
    return 0;
}

int prefix(trie *nod, char *s, int k) {
    if(*s == NULL || nod->fii[ch] == 0)
        return k;
    return prefix(nod->fii[ch], s+1, k+1);
}

int main() {
    while(f >> op >> cuv) {
        if(op == 0)
            Insert(t, cuv);
        else if(op == 1)
            Delete(t, cuv);
        else if(op == 2)
            g << nrCuv(t, cuv) << '\n';
        else
            g << prefix(t, cuv, 0) << '\n';
    }
}