Cod sursa(job #1320345)

Utilizator MKLOLDragos Ristache MKLOL Data 17 ianuarie 2015 21:19:28
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
#define SIGMA 26
struct trie
{
int nod,nrfii;
trie *next[SIGMA];
    trie()
    {
    nod=nrfii=0;
    memset(next,0,sizeof( next ) );
    }
};
trie *T = new trie;
char sir[1101010];
int N,a;
int adauga(trie *anod,char *s)
{
    int k =0;

    while(true){
        if(*s=='\n')
        {
            anod->nod ++;
            return 0;
        }
        if(anod->next[*s-'a'] == 0)
        {
            anod->next[*s-'a']=new trie;
            anod->nrfii++;
        }
        anod = anod->next[ *s-'a' ];
        s = s+1;
    }
}
int sterge(trie *anod,char *s)
{
    if(*s=='\n')
        anod->nod--;
    else if( sterge( anod->next[ *s-'a' ],s+1))
    {
        anod->next[ *s-'a' ] = 0;
        anod->nrfii--;
    }
    if(anod->nod == 0&&anod->nrfii==0&& anod!= T )
    {
        delete anod;
        return 1;
    }
return 0;
}
int afis(trie *anod, char *s)
{
    while(true){
    if(*s=='\n')
        return anod->nod;
    if(anod -> next  [*s - 'a']) {
        anod = anod->next[*s-'a'];
        s=s+1;
        }
        else return 0;
    }
}
int ver(trie *anod,char *s,int k)
{
    while(true){
    if(*s=='\n' || !anod->next[*s-'a'])
        return k;
    anod=anod->next[*s-'a'];
    s=s+1;
    k=k+1;
    }
}
int x=0;
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
   while(scanf("%d ",&a)==1)
    {
    x=0;
  //  printf("%d", a);
    fgets(sir,1100000,stdin);
    //cout<<"!";
    if(a==0)
    x=adauga(T,sir);
    //cout<<"!";
    if(a==1)
    x=sterge(T,sir);
    if(a==2)
    {
    x=afis(T,sir);
    printf("%d\n",x);
    }
    if(a==3)
    {

    printf("%d\n",ver(T,sir,0));
    }
  //  cout<<sir;
    }
}