Cod sursa(job #1577462)

Utilizator razvan242Zoltan Razvan-Daniel razvan242 Data 23 ianuarie 2016 14:31:25
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

const int SIGMA = 26;

struct node {
    node() {
        words = sons = 0;
        memset(son, 0, sizeof son);
    }

    int words, sons;
    node* son[SIGMA];
};

node* root = new node;
char a[SIGMA];

void ins(node* nod, char* p) {
    if (*p == '\0') {
        nod->words++;
        return;
    }

    if (nod->son[*p - 'a'] == 0) {
        nod->son[*p - 'a'] = new node;
        nod->sons++;
    }
    ins(nod->son[*p - 'a'], p + 1);
}

bool del(node* nod, char* p) {
    if (*p == '\0')
        nod->words--;
    else {
        if (del(nod->son[*p - 'a'], p + 1)) {
            nod->son[*p - 'a'] = 0;
            nod->sons--;
        }
    }

    if (nod->words == 0 && nod->sons == 0 && nod != root) {
        delete nod;
        return 1;
    }
    return 0;
}

int numar(node* nod, char* p) {
    if (*p == '\0') {
        return nod->words;
    }

    if (nod->son[*p - 'a'])
        return numar(nod->son[*p - 'a'], p + 1);
    return 0;
}

int prefix(node* nod, char* p, int k) {
    if (*p == '\0' || nod->son[*p - 'a'] == 0)
        return k;
    return prefix(nod->son[*p - 'a'], p + 1, k + 1);
}

int main()
{
    while (fin.getline(a, SIGMA)) {
        switch (a[0]) {
            case '0': ins(root, a + 2); break;
            case '1': del(root, a + 2); break;
            case '2': fout << numar(root, a + 2) << '\n'; break;
            case '3': fout << prefix(root, a + 2, 0) << '\n'; break;
        }
    }
    return 0;
}