Cod sursa(job #1509321)

Utilizator timicsIoana Tamas timics Data 23 octombrie 2015 18:46:44
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<fstream>
#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct Trie {
    int cnt, nrfii;
    Trie *fiu[26];
    Trie() {
        cnt = nrfii = 0;
        memset(fiu,0,sizeof(fiu));
    }
};
Trie *T = new Trie;

void ins(Trie *nod, char *s) {
    if(*s=='\n') {
        ++nod->cnt;
        return;
    }
    if(nod->fiu[*s-'a']==0) {
        nod->fiu[*s-'a'] = new Trie;
        ++nod->nrfii;
    }
    ins(nod->fiu[*s-'a'],s+1);
}
int del(Trie *nod, char *s) { //only call if exists!!
    if(*s == '\n')
        --nod->cnt;
    else if(del(nod->fiu[*s-'a'],s+1)) {
        nod->fiu[*s-'a'] = 0;
        --nod->nrfii;
    }
    if(nod->cnt == 0 && nod->nrfii == 0 && nod !=T) {
        delete nod;
        return 1;
    }
    return 0;
}
int number(Trie *nod, char *s) {
    if(*s == '\n') {
        return nod->cnt;
    }
    if(nod->fiu[*s-'a']) {
        return number(nod->fiu[*s-'a'],s+1);
    }
    return 0;
}
int longest_prefix(Trie *nod, char *s, int k) {
    if(*s == '\n' || nod->fiu[*s-'a'] == 0) {
        return k;
    }
    return longest_prefix(nod->fiu[*s-'a'],s+1,k+1);
}

int main() {
    char line[32];

    freopen( "trie.in","r",stdin );
    freopen( "trie.out","w",stdout );
    fgets(line,32,stdin );

    while(!feof(stdin)) {
        if(line[0]=='0') {
            ins(T, line+2);
        }
        if(line[0]=='1') {
            del(T, line+2);
        }
        if(line[0]=='2') {
            printf("%d\n",number(T, line+2));
        }
        if(line[0]=='3') {
            printf("%d\n",longest_prefix(T, line+2,0));
        }
        fgets( line, 32, stdin );
    }
    return 0;
}