Cod sursa(job #1829524)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 15 decembrie 2016 09:30:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <cstring>
#include <iostream>

using namespace std;

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

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

trie* inc;

char s[25];

int rez2(trie *k, char *n) {
    if (!(*n >='a'&&*n<='z'))
        return k -> nap;
    if (k -> fi[*n-'a'])
        return rez2(k->fi[*n-'a'],n+1);
    return 0;
}

int rez1(trie *k, char *n) {
    int sol = 0;
    while (*n >= 'a' && *n <= 'z') {
        if (k -> fi[*n - 'a'])
            k = k -> fi[*n-'a'];
        else break;
        sol++;
        n++;
    }
    return sol;
}

void inser(trie *k, char *n) {

    while (*n >= 'a' && *n <= 'z') {
        if (k -> fi[*n-'a'] == 0) {
            k -> fi[*n-'a'] = new trie;
            k -> nfii++;
        }
        k = k -> fi[*n-'a'];
        n++;
    }
    k -> nap++;
}

int delet(trie *k, char *n ) {

    if (!(*n >= 'a' && *n <= 'z')) {
        k -> nap--;
    }
    else if (delet(k -> fi[*n-'a'], n+1)) {
        k -> fi[*n-'a']= 0;
        k -> nfii--;
    }
    if (k -> nfii == 0 && k -> nap == 0 && k != inc){
        delete k;
        return 1;
    }
    return 0;
}

int main() {
    inc = new trie;
    while (f.getline(s, sizeof(s))) {
        if (s[0] == '0')
            inser(inc, s+2);
        else if (s[0] == '1')
            delet(inc, s+2);
        else if (s[0] == '2')
            g << rez2(inc, s+2)<<'\n';
        else g << rez1(inc, s+2)<<'\n';
    }

    return 0;
}