Cod sursa(job #1675771)

Utilizator serbanSlincu Serban serban Data 5 aprilie 2016 16:01:50
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <cstring>
#include <cstdlib>

using namespace std;

char s[25];

struct node {
    int nr = 0;
    node *n[30];
};
node *start = NULL;

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

bool del(int i, node *&p) {
    if(i == N) {
        p->nr --;
        if(p->nr == 0) {
            p = NULL;
            delete(p);
            return false;
        }
        return true;
    }
    else {
        if(!del(i + 1, p->n[s[i] - 'a'])) {
            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 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;
    while(f >> o >> s) {
        N = strlen(s);
        if(o == 0) add(0, start);
        else if(o == 1) del(0, start);
        else if(o == 2) g << nr(0, start) << "\n";
        else if(o == 3) g << len(0, start) << "\n";
    }
    return 0;
}