Pagini recente » Cod sursa (job #1956436) | Cod sursa (job #2655385) | Cod sursa (job #2439018) | Cod sursa (job #198153) | Cod sursa (job #877503)
Cod sursa(job #877503)
#include<stdio.h>
#include<string.h>
struct trie{
trie *f[26];
int nr,nrf;
trie(){
nr=nrf=0;
memset(f,0,sizeof(f));
}
};
trie *r;
int n,m,k;
char x[30];
void adaug(){
trie *q;
q=r;
for(int i=0;i<m;i++){
if(q->f[x[i]-'a']==0){
q->nrf++;
q->f[x[i]-'a']=new trie();
}
q=q->f[x[i]-'a'];
}
q->nr++;
}
int numar(){
trie *q;
q=r;
for(int i=0;i<m;i++)
if(q->f[x[i]-'a']==0)
return 0;
else
q=q->f[x[i]-'a'];
return q->nr;
}
int prefix(){
trie *q;
q=r;
for(int i=0;i<m;i++){
if(q->f[x[i]-'a']==0)
return i;
q=q->f[x[i]-'a'];
}
return m;
}
void sterg(trie *q,int i){
if(i==m)
q->nr--;
else{
sterg(q->f[x[i]-'a'],i+1);
if(q->f[x[i]-'a']->nr==0&&q->f[x[i]-'a']->nrf==0){
delete q->f[x[i]-'a'];
q->f[x[i]-'a']=0;
q->nrf--;
}
}
}
int main(){
FILE *f,*g;
r=new trie();
f=fopen("trie.in","r");
g=fopen("trie.out","w");
while(!feof(f)){
fscanf(f,"%d %s",&k,x);
if(feof(f))
break;
m=strlen(x);
if(k==0)
adaug();
if(k==1)
sterg(r,0);
if(k==2)
fprintf(g,"%d\n",numar());
if(k==3)
fprintf(g,"%d\n",prefix());
}
fclose(f);
fclose(g);
return 0;
}