Cod sursa(job #735145)

Utilizator test0Victor test0 Data 15 aprilie 2012 19:37:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <cctype>
struct arb{ int n,p; struct arb*f[27]; }*a;
char s[40];

void add(char*g){
    arb*b=a;
    int urm;
    while(isalpha(*g)){
    urm=*g-'a';
        if(b->f[urm]==0){b->f[urm]=new arb;b->f[urm]->n=0;b->f[urm]->p=0;}
        b=b->f[urm];
        b->p++;
        g++; }
    b->n++;
}

void remove(char*g){
    arb*b=a;
    int urm;
    while(isalpha(*g)){
    urm=*g-'a';
        b=b->f[urm];
        b->p--;
        g++; }
    b->n--;
}

int full(char*g){
    arb*b=a;
    int urm;
    while(isalpha(*g)){
    urm=*g-'a';
        if(b->f[urm]==0)return 0;
        b=b->f[urm];
        g++; }
    return b->n;
}

int dmax(char*g){
    arb*b=a;
    int urm,m=0,i=0;
    while(isalpha(*g)){
    urm=*g-'a';i++;
        if(b->f[urm]==0)return m;
        b=b->f[urm];
        if(b->p>0)m=i;
        g++; }
    return m;
}

int main(){
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    a=new arb;
        while(fgets(s,30,stdin)){
            switch(s[0]-'0'){
                case 0: add(s+2); break;
                case 1: remove(s+2); break;
                case 2: printf("%d\n",full(s+2)); break;
                case 3: printf("%d\n",dmax(s+2)); break; }
        }
}