Cod sursa(job #2453223)

Utilizator vlad082002Ciocoiu Vlad vlad082002 Data 2 septembrie 2019 20:18:13
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <iostream>
#include <cstring>
#define ch (*s-'a')
using namespace std;

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

int op;
char line[32];

struct trie{
    int nrfii, val;
    trie* fii[26];

    trie() {
        val = nrfii = 0;
        for(int i = 0; i < 26; i++)
            fii[i] = 0;
    }
};
trie *t = new trie;

void Insert(trie *nod, char* s) {
    if(*s == NULL) {
        nod->val++;
        return;
    }

    if(nod->fii[ch] == 0) {
        nod->fii[ch] = new trie;
        nod->nrfii++;
    }

    Insert(nod->fii[ch], s+1);
}

int Delete(trie *nod, char *s) {
    if(*s == NULL)
        nod->val--;
    else if(Delete(nod->fii[ch], s+1)) {
        nod->fii[ch] = 0;
        nod->nrfii--;
    }

    if(nod->val == 0 && nod->nrfii == 0 && nod != t) {
        delete nod;
        return 1;
    }

    return 0;
}

int nrCuv(trie *nod, char *s) {
    if(*s == NULL)
        return nod->val;
    if(nod->fii[ch])
        return nrCuv(nod->fii[ch], s+1);
    return 0;
}

int prefix(trie *nod, char *s, int k) {
    if(*s == NULL || nod->fii[ch] == 0)
        return k;
    return prefix(nod->fii[ch], s+1, k+1);
}

int main() {
    while(!f.eof()) {
        f.getline(line, 32);
        if(line[0] == '0')
            Insert(t, line+2);
        else if(line[0] == '1')
            Delete(t, line+2);
        else if(line[0] == '2')
            g << nrCuv(t, line+2) << '\n';
        else
            g << prefix(t, line+2, 0) << '\n';
    }
}