Cod sursa(job #2197067)

Utilizator catalina200029Olteanu Catalina catalina200029 Data 21 aprilie 2018 09:13:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

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

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

    trie() {
        nrfii=cnt=0;
        memset(fii,0,sizeof(fii));
    }
}*T;

void add(trie *nod,char *s) {
    if (*s=='\n')
        nod->cnt++;
    else {
        if (!nod->fii[*s-'a']) {
            nod->fii[*s-'a']=new trie;
            nod->nrfii++;
        }
        add(nod->fii[*s-'a'],s+1);
    }
}

int aparitii(trie *nod,char *s) {
    if (*s=='\n') return nod->cnt;
    if (nod->fii[*s-'a']) return aparitii(nod->fii[*s-'a'],s+1);
    return 0;
}

int prefix(trie *nod,char *s,int k) {
    if (*s=='\n' || nod->fii[*s-'a']==0) return k;
    else prefix(nod->fii[*s-'a'],s+1,k+1);
}

int del(trie *nod,char *s) {
    if (*s=='\n') nod->cnt--;
    else if(del(nod->fii[*s-'a'],s+1)) {
        nod->fii[*s-'a']=NULL;
        nod->nrfii--;
    }
    if (nod!=T && nod->cnt==0 && nod->nrfii==0) {
        delete nod;
        return 1;
    }
    return 0;
}

int main() {
    int x,y;
    char s[25];
    T=new trie;
    while (f.getline(s,25)) {
        strcat(s,"\n");
        switch (s[0]) {
            case '0': add(T,s+2); break; ///adaugare
            case '1': del(T,s+2); break; ///stergere
            case '2': g<<aparitii(T,s+2)<<'\n'; break; ///tiparire nr aparitii
            case '3':  g<<prefix(T,s+2,0)<<'\n'; break; ///tiparire lungime prefix maxim
        }
    }
    return 0;
}