Pagini recente » Cod sursa (job #549402) | Cod sursa (job #2752144) | Cod sursa (job #876926) | Cod sursa (job #3152006) | Cod sursa (job #1375956)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
struct nod
{
char inf;
int cuv,nr_plozi;
nod *plozi[25];
nod(char a)
{
inf=a;
nr_plozi=0;
cuv=0;
memset(plozi,0,sizeof(plozi));
}
};
void adaugare(char *p,nod *x)
{
if(p[0]=='\0')
{
x->cuv++;
return;
}
for(int i=0;i<x->nr_plozi;i++)
if(x->plozi[i]->inf==p[0])
{
adaugare(p+1,x->plozi[i]);
return;
}
nod *aux=new nod(p[0]);
x->plozi[x->nr_plozi++]=aux;
adaugare(p+1,x->plozi[x->nr_plozi-1]);
}
void stergere(char *p,nod *x)
{
if(p[0]=='\0')
{
x->cuv--;
if(x->cuv==0 && x->nr_plozi==0)
delete x;
return;
}
for(int i=0;i<x->nr_plozi;i++)
if(x->plozi[i]->inf==p[0] )
{
stergere(p+1,x->plozi[i]);
return;
}
}
void tiparire(char *p,nod *x)
{
if(p[0]=='\0')
{
printf("%d\n",x->cuv);
return;
}
for(int i=0;i<x->nr_plozi;i++)
if(x->plozi[i]->inf==p[0])
{
tiparire(p+1,x->plozi[i]);
return;
}
printf("0\n");
}
int prefix(char *p,nod *x)
{
if(p[0]=='\0')
return 0;
for(int i=0;i<x->nr_plozi;i++)
if(x->plozi[i]->inf==p[0] )
return 1+prefix(p+1,x->plozi[i]);
return strlen(p);
}
void citire()
{
ifstream fin("trie.in");
nod *st = new nod('\0');
char s[100100];
while(fin.getline(s,100100))
{
char a=s[0];
strcpy(s,s+2);
if(a=='0')
adaugare(s,st);
else if(a=='1')
stergere(s,st);
else if(a=='2')
tiparire(s,st);
else if(a=='3')
printf("%d\n",prefix(s,st));
}
}
int main()
{
freopen("trie.out","w",stdout);
citire();
return 0;
}