Cod sursa(job #1857409)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 26 ianuarie 2017 10:34:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <cstring>

using namespace std;

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

int x, y, i, c;
char s[30];

struct trie {
    int nfii, cnt;
    trie* fi[30];
    trie() {
        nfii = 0, cnt = 0;
        memset(fi, 0, sizeof(fi));
    }
};
trie *inc = new trie;

void add(trie *t, char *s) {
    if (*s < 'a')  {
        t -> cnt++;
        return;
    }
    if (t -> fi[*s-'a'] == 0)
        t -> fi[*s-'a'] = new trie, t -> nfii++;
    add(t -> fi[*s-'a'],s+1);
}

bool remove(trie *t, char *s) {
    if(!(*s>='a'&&*s<='z')) {
        if (t -> cnt)
            t -> cnt--;
    }
    else if (remove(t -> fi[*s-'a'], s+1))
        t -> nfii--, t -> fi[*s-'a'] = 0;

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

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

int query2(trie *t, char *s, int l) {
    if (*s < 'a' || t -> fi[*s-'a'] == 0)
        return l;
    if (t -> fi[*s-'a'])
        return query2(t -> fi[*s-'a'], s+1, l+1);
    return 0;
}

int main() {
    while(f.getline(s, sizeof(s))) {
        if (s[0] == '0')
            add(inc, s+2);
        else if (s[0] == '1')
            remove(inc,s+2);
        else if (s[0] == '2')
            g << query1(inc,s+2) <<'\n';
        else
            g << query2(inc,s+2, 0) <<'\n';
    }
    return 0;
}