Cod sursa(job #982972)

Utilizator classiusCobuz Andrei classius Data 10 august 2013 16:18:50
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <cstring>
#define ch (*s-'a')

using namespace std;

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

struct trie{
    int cnt,nrf;
    trie *fii[26];
    trie(){
        cnt=nrf=0;
        memset(fii,0,sizeof(fii));
    }
};

trie* t=new trie;

void insert(trie *nod,char *s){
    if(*s=='\0'){
        nod->cnt++;
        return;
    }
    if(!nod->fii[ch]){
        nod->nrf++;
        nod->fii[ch]=new trie;
    } insert(nod->fii[ch],s+1);
}

bool del(trie *nod,char *s){
    if(*s=='\0')
        nod->cnt--;
    else if(del(nod->fii[ch],s+1)){
        nod->nrf--;
        nod->fii[ch]=0;
    }
    if(!nod->cnt&&!nod->nrf&&nod!=t){
        delete nod; return 1;
    }
    return 0;
}

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

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

int main()
{
    char a[40];
    while(f.getline(a,30)){
        switch(a[0]){
            case '0': insert(t,a+2); break;
            case '1': del(t,a+2); break;
            case '2': g<<nrap(t,a+2)<<'\n'; break;
            case '3': g<<smax(t,a+2,0)<<'\n'; break;
        }
    }
    return 0;
}