Cod sursa(job #1676102)

Utilizator serbanSlincu Serban serban Data 5 aprilie 2016 18:42:56
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <cstring>
#include <cstdio>

using namespace std;

char s[25];

struct node {
    int nr = 0;
    node *n[30];
    node() {
        memset(n, 0, sizeof(n));
    }
};
node *start = NULL, *p;

int N;
void add(node *&p, int i) {
    if(p == NULL) p = new node;
    if(i == N) {
        p->nr ++;
        return ;
    }
    add(p->n[s[i] - 'a'], i + 1);
}

bool del(node *&p, int i) {
    if(i == N) {
        p->nr --;
        if(p->nr == 0) {
            bool ok = false;
            for(int j = 0; j < 26; j ++)
                ok = ok | (p->n[j] != NULL);
            if(!ok) p = NULL, delete(p);
            return ok;
        }
        return true;
    }
    else {
        if(!del(p->n[s[i] - 'a'], i + 1)) {
            if(p->nr) return true;
            bool ok = false;
            for(int i = 0; i < 26; i ++)
                ok = ok | (p->n[i] != NULL);
            if(!ok) {
                p = NULL;
                delete(p);
            }
            return ok;
        }
        return true;
    }
}

int nr(int i, node *p) {
    if(p == NULL) return 0;
    if(i == N) return p->nr;
    return nr(i + 1, p->n[s[i] - 'a']);
}

int len(int i, node *p) {
    if(p == NULL) return max(0, i - 1);
    if(i == N) return i;
    return len(i + 1, p->n[s[i] - 'a']);
}

int main()
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    int o;
    start = new node;

    while(f >> o >> s) {
        N = strlen(s);
        if(o == 0) add(start, 0);
        else if(o == 1) del(start, 0);
        else if(o == 2) g << nr(0, start) << "\n";
        else if(o == 3) g << len(0, start) << "\n";
    }
    return 0;
}