Cod sursa(job #1965760)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 14 aprilie 2017 16:39:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <iostream>
#include <cstring>

using namespace std;

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

struct trie {
    int nfii, cnt;
    trie *k[30];
    trie() {
        memset(k,0,sizeof(k));
        nfii=cnt=0;
    }
};
trie *inc;
char s[40];

void inser(trie *t, char *k) {
    while (*k >= 'a') {
        int c = *k-'a';
        if (t -> k[c] == 0) t -> k[c] = new trie, t->nfii++;
        t = t -> k[c];
        k++;
    }
    t -> cnt++;
}

bool delet(trie *t, char *k) {
    int c = *k-'a';
    if (*k < 'a')
        t -> cnt--;
    else if (t -> k[c] && delet(t -> k[c], k+1))
        t -> k[c] = 0, t -> nfii--;

    if (t -> nfii == 0 && t -> cnt == 0 && t != inc) {
        delete t;
        return 1;
    }
    return 0;
}

int q1(trie *t, char *k) {
    if (*k < 'a') return t -> cnt;
    if (t -> k[*k-'a']) return q1(t -> k[*k-'a'], k+1);
    return 0;
}

int q2(trie *t, char *k, int K) {
    if (*k<'a'||t -> k[*k-'a'] == 0) return K;
    else return q2(t -> k[*k-'a'], k+1, K+1);
    return 0;
}

int main() {
    inc = new trie;
    while (f.getline(s, sizeof(s))) {
        if (s[0] == '0') inser(inc, s+2);
        else if (s[0] == '1') delet(inc, s+2);
        else if (s[0] == '2') g << q1(inc, s+2) << '\n';
        else cout<<'\n',g << q2(inc,s+2,0)<<'\n';

    }
}