Cod sursa(job #720103)

Utilizator I.AlexandruIlie Alexandru I.Alexandru Data 22 martie 2012 12:58:29
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<iostream>
using namespace std;

struct trie{
int prefixe, cuvinte;
trie *link[26]; 

trie()
{for(int i=26; i--;)
   link[i]=0;
cuvinte=prefixe=0;
}
      
};

void inserare(trie *x, char *cuv)
{for(int i=0, t=cuv[i]-97, n=strlen(cuv); i<n; i++, t=cuv[i]-97, x->prefixe++)
    if(x->link[t]!=NULL)
      x=x->link[t];  
	else x=x->link[t]=new trie();
 	
x->cuvinte++;
}

void stergere(trie *x, char *cuv)//se garanteaza cuv in trie
{for(int i=0, t=cuv[i]-97, n=strlen(cuv); i<n; i++, t=cuv[i]-97, x->prefixe--)
    if(x->link[t]!=NULL)
      x=x->link[t];
      			
x->cuvinte--;
}

int nr_aparitii(trie *x, char *cuv)
{for(int i=0, t=cuv[i]-97, n=strlen(cuv); i<n; i++, t=cuv[i]-97)
    if(x->link[t]!=NULL)
      x=x->link[t];		
	else return 0;
	
return x->cuvinte;
}

int prefix_comun(trie *x, char *cuv)
{int i=0;
for(int t=cuv[0]-97, n=strlen(cuv); i<n && x->link[t]!=NULL && x->link[t]->prefixe!=0; i++, t=cuv[i]-97)
   if(x->link[t]!=NULL)
	 x=x->link[t];
    	
return i;
}

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

trie x;
int choice;
char string[26];

for(; cin>>choice>>string;)
  {switch(choice){ case 0: {inserare(&x, string);;
                            break;
                           }        
                   case 1: {stergere(&x, string);
                            break;
                           }               
                   case 2: {cout<<nr_aparitii(&x, string)<<"\n";
                            break;
                           }              
                   case 3: {cout<<prefix_comun(&x, string)<<"\n";                    
                            break;
                          }     
                 }
  }

return 0;    
}