Cod sursa(job #1892517)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 25 februarie 2017 01:06:21
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
#define ch (*s-'a')
using namespace std;

struct Trie{
    int cnt,nrfii;
    Trie *v[26];

    Trie(){
        cnt=nrfii=0;
        memset(v, 0, sizeof(v));
    }
};
Trie *T=new Trie;
char l[30];
int lenght;


void Ins(Trie *Node, char *s){
    if(*s==NULL) Node->cnt++;
    else{
        if(Node->v[ch]==0){
            Node->v[ch]=new Trie;
            Node->nrfii++;
        }
        Ins(Node->v[ch], s+1);
    }
}
int Del(Trie *Node, char *s){
    if(*s==NULL) Node->cnt--;
    else{
        if(Del(Node->v[ch], s+1)){
            Node->nrfii--;
            Node->v[ch]=0;
        }
    }

    if(Node->cnt==0 && Node->nrfii==0 && Node!=T){
        delete Node;
        return 1;
    }
    return 0;
}
void Ap(Trie *Node, char *s){
    if(*s==NULL) printf("%d\n",Node->cnt);
    else{
        if(Node->v[ch]==0) return;
        Ap(Node->v[ch], s+1);
    }
}
void Pref(Trie *Node, char *s){
    if(*s==NULL or Node->v[ch]==0){
        printf("%d\n",lenght);
        lenght=0;
        return;
    }
    lenght++;
    Pref(Node->v[ch], s+1);
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    while(gets(l)){
        if(l[0]=='0') Ins(T, l+2);
        if(l[0]=='1') Del(T, l+2);
        if(l[0]=='2') Ap(T, l+2);
        if(l[0]=='3') Pref(T, l+2);
    }

    return 0;
}