Cod sursa(job #2406605)

Utilizator eduardcadarCadar Eduard eduardcadar Data 15 aprilie 2019 22:11:15
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <cstring>
#include <cstdio>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
char a[32];
struct trie{
    int cnt, nrfii;
    trie *fiu[26];
    trie() {
        cnt = nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
} *T;
void ins(trie *nod, char *s) {
    if (*s == '\n') { nod->cnt++; return; }
    if (nod->fiu[*s - 'a'] == 0) { nod->fiu[*s - 'a'] = new trie; nod->nrfii++; }
    ins(nod->fiu[*s - 'a'], s+1);
}
int del(trie *nod, char *s) {
    if (*s == '\n') nod -> cnt--;
    else if (del(nod -> fiu[*s - 'a'], s+1)) {
        nod -> fiu[*s - 'a'] = 0;
        nod -> nrfii--;
    }
    if (nod -> cnt == 0 && nod -> nrfii == 0 && nod != T) {
        delete nod;
        return 1;
    }
    return 0;
}
int ap(trie *nod, char *s) {
    if (*s == '\n') return nod -> cnt;
    if (nod -> fiu[*s - 'a']) return ap(nod -> fiu[*s - 'a'], s+1);
    return 0;
}
int pre(trie *nod, char *s, int k) {
    if (*s == '\n' || nod -> fiu[*s - 'a'] == 0) return k;
    return pre(nod -> fiu[*s - 'a'], s+1, k+1);
}
int main()
{
    freopen("trie.in", "r", stdin);
    T = new trie;
    fgets(a, 32, stdin);
    while (!feof(stdin)) {
        if (*a == '0') ins(T,a+2);
        if (*a == '1') del(T,a+2);
        if (*a == '2') g << ap(T,a+2) << '\n';
        if (*a == '3') g << pre(T,a+2,0) << '\n';
        fgets(a, 32, stdin);
    }
    return 0;
}