Cod sursa(job #716983)

Utilizator AnaTudorTudor Ana Maria Mihaela AnaTudor Data 19 martie 2012 14:38:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include<stdio.h>
#include<string.h>

using namespace std;

struct trie{ int nr_cuv;
             int nr_fii;
             trie *lit[26];
     trie(){ nr_cuv=0; nr_fii=0;
             memset(lit,0,sizeof(lit));}
};
trie *T=new trie;

void inserare(char s[21])
{   int i=0;
    trie *t=T;
    while(i<=strlen(s))
     { if (i==strlen(s))
          { t->nr_cuv++;  return; }
        if(t->lit[s[i]-'a']!=0)
                {  t->nr_fii++; t=t->lit[s[i]-'a']; i++; }
        else
         if(t->lit[s[i]-'a']==0)
            {t->lit[s[i]-'a']=new trie;  t->nr_fii++;  t=t->lit[s[i]-'a']; i++; }

    }
}

void stergere(char s[21])
{ int i=0;
  trie *t=T;
  while(i<=strlen(s))
  {  if(i==strlen(s) && t->nr_cuv>=0)
       { t->nr_cuv--; return;}
     if(t->lit[s[i]-'a']!=0)
       { t->nr_fii--; t=t->lit[s[i]-'a']; i++; }
  }
}

void numar_aparitii(char s[21])
{ int i=0;
  trie *t=T;
  while(i<=strlen(s))
  {  if (i==strlen(s))
       { printf("%d\n",t->nr_cuv); return ;}
     if (t->lit[s[i]-'a']!=0)
       { t=t->lit[s[i]-'a']; i++; }
         else
         { printf("0\n"); return;}
} }

void prefix(char s[21])
{ int i=0,pref=0;
   trie *t=T;
while(i<=strlen(s))
{ if(i==strlen(s))
   { printf("%d\n",strlen(s));  return; }
  if(t->lit[s[i]-'a']==0)
    { printf("%d\n",pref); return ;}
  if(t->lit[s[i]-'a']!=0)
    {t=t->lit[s[i]-'a'];
       if (t->nr_fii==0 && t->nr_cuv==0 )
          { printf("%d\n",i); return;}
        else
          { i++; pref=i;}
    }
   else
    { printf("%d\n",pref); return ;}
}}

int main()
{
  freopen("trie.in","r",stdin);
  freopen("trie.out","w",stdout);
  int op; char s[21];
  scanf("%d%s",&op,&s);
  while(!feof(stdin))
  { if(op==0)
     inserare(s);
    else
      if(op==1)
        stergere(s);
      else
        if(op==2)
          numar_aparitii(s);
        else
          prefix(s);
    scanf("%d%s",&op,&s);
  }
  return 0;
}