Pagini recente » Cod sursa (job #2527722) | Cod sursa (job #1966663) | Cod sursa (job #2239657) | Cod sursa (job #1411758) | Cod sursa (job #304309)
Cod sursa(job #304309)
#include<stdio.h>
#include<string.h>
struct nod
{
int nr;
char inf;
nod* leg[27];
};
nod *start;
nod* creare(char inf)
{
nod *p=new nod();
p->nr=1;
p->inf=inf;
for(int i=0;i<26;i++)
p->leg[i]=NULL;
return p;
}
void add(nod* p,char inf)
{
int val=inf-'a';
if(p->leg[val]==NULL)
{
nod *q=creare(inf);
p->leg[val]=q;
}
}
void add(nod *p, char* inf)
{
int n=strlen(inf);
for(int i=0;i<n;i++)
{
if(p->leg[inf[i]-'a']==NULL)
add(p,inf[i]);
else
p->leg[inf[i]-'a']->nr++;
p=p->leg[inf[i]-'a'];
}
}
void sterge(nod* p,char* inf)
{
if(inf[0]!=0&&p)
if(p->leg[inf[0]-'a']->nr==1)
{
nod *q=p->leg[inf[0]-'a'];
p->leg[inf[0]-'a']=NULL;
sterge(q,inf+1);
delete(q);
}
else
{
p->leg[inf[0]-'a']->nr--;
nod *q=p->leg[inf[0]-'a'];
sterge(q,inf+1);
}
}
int nr_ap(char* inf)
{
int n=strlen(inf), numar=0,sum=0,i;
nod *p=start;
for(i=0;i<n&&p->leg[inf[i]-'a'];i++)
{
p=p->leg[inf[i]-'a'];
numar=p->nr;
}
if(i!=n)
return 0;
for(i=0;i<26;i++)
if(p->leg[i])
sum+=p->leg[i]->nr;
return numar-sum;
}
int prefix( nod* p, char *s, int k )
{
if( *s == '\n' || p->leg[*s-'a'] == 0 )
return k;
return prefix( p->leg[*s-'a'], s+1, k+1 );
}
int main()
{
int cod;
char aux[1000];
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
start=creare('*');
// scanf("%d %s",&cod,aux);
while(!feof(stdin))
{
scanf("%d %s\n",&cod,aux);
switch(cod)
{
case 0: add(start,aux);break;
case 1: sterge(start,aux);break;
case 2: printf("%d\n",nr_ap(aux));break;
case 3: printf("%d\n",prefix(start,aux,0));break;
}
}
return 0;
}