Cod sursa(job #1109861)

Utilizator deneoAdrian Craciun deneo Data 17 februarie 2014 17:45:09
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cstring>

using namespace std;

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

struct Trie {
    int fn, sz;
    Trie *sir[26];

    Trie () {
        sz = 0; fn = 0;
        memset(sir, 0, sizeof sir);
    }
};

Trie *trie = new Trie;

string s;

void adauga(int poz, Trie *cur) {
    if (poz == s.size()) {
        ++cur->fn;
        return;
    }

    int a = s[poz] - 'a';

    if (cur->sir[a] == 0) {
        ++cur->sz;
        cur->sir[a] = new Trie;
    }

    adauga(poz + 1, cur->sir[a]);
}

bool sterge(int poz, Trie *cur) {
    if (poz == s.size()) {
        --cur->fn;
    }
    else {
        int a = s[poz] - 'a';
        if (sterge(poz + 1, cur->sir[a])) {
            --cur->sz;
            cur->sir[a] = 0;
        }
    }

    if (cur->sz == 0 && cur->fn == 0) {
        delete cur;
        return 1;
    }

    return 0;
}

int get_aparitii(int poz, Trie *cur) {
    if (poz == s.size()) {
        return cur->fn;
    }

    int a = s[poz] - 'a';
    if (cur->sir[a] == 0) return 0;
    else return get_aparitii(poz + 1, cur->sir[a]);
}

int get_prefix(int poz, Trie *cur) {
    if (poz == s.size())
        return 0;
    int a = s[poz] - 'a';

    if (cur->sir[a] == 0) return 0;
    else return 1 + get_prefix(poz + 1, cur->sir[a]);
}

int main()  {
    int type = 0;
    while (fin >> type) {
        fin >> s;

        if (type == 0)
            adauga(0, trie);
        else if (type == 1)
            sterge(0, trie);
        else if (type == 2)
            fout << get_aparitii(0, trie) << "\n";
        else
            fout << get_prefix(0, trie) << "\n";

    }

    return 0;
}