Cod sursa(job #736240)

Utilizator excelsiorExcelsior excelsior Data 18 aprilie 2012 11:01:47
Problema Trie Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
int N;
struct nod{
nod **next;
int nrap,nrs;
nod()
{

    nrap=0;
    nrs=0;
}
};

ofstream fout("trie.out");
char demo[50];
typedef nod* trie;
trie R=new nod;


void ins(trie &n,int p)
{
    if(p==N)
    {
        n->nrap++;
        return;
    }
    //cout<<demo[p]<<" \n";
    if(n->next==NULL)
    {
        n->next=new nod*[26];
        memset(n->next,0,sizeof(n->next));

    }
    //cout<<"ok2 \n";
    if(n->next[demo[p]-'a']==NULL)
    {
        n->next[demo[p]-'a']=new nod;
        n->nrs++;
    }
    ins(n->next[demo[p]-'a'],p+1);
}

int sterge(trie &n,int p)
{
    if(p==N)
      n->nrap--;
    else
      if(sterge(n->next[demo[p]-'a'],p+1))
      {
          n->nrs--;
          n->next[demo[p]-'a']=NULL;
      }
      if(n->nrs==0 && n->nrap==0 && n!=R)
      {
          delete n;
          return 1;
      }
      return 0;
}

int nrapar(trie &n,int p)
{
    if(demo[p]=='\0' || n->next==NULL)
      return n->nrap;
    if(n->next!=NULL)
    if(n->next[demo[p]-'a'])
      return nrapar(n->next[demo[p]-'a'],p+1);
    return 0;
}

int cauta(trie &n,int p,int k)
{
    if(p==N || n->next==NULL)
       return k;
    if(p==N || n->next[demo[p]-'a']==NULL)
       return k;
    return  cauta(n->next[demo[p]-'a'],p+1,k+1);
}

void cit()
{
    char x;
    ifstream fin("trie.in");
    int dumm;
    while(fin>>dumm)
    {
        fin.get(demo,2);
        fin.getline(demo,50);
        N=strlen(demo);

        if(dumm==0) ins(R,0);
        if(dumm==1) sterge(R,0);
        if(dumm==2) fout<<nrapar(R,0)<<"\n";
        if(dumm==3)  fout<<cauta(R,0,0)<<"\n";
    }


    fin.close();
}

int main()
{
    cit();

    fout.close();
    return 0;
}