Pagini recente » Cod sursa (job #1022004) | Cod sursa (job #1707214) | Cod sursa (job #2713938) | Cod sursa (job #2672013) | Cod sursa (job #1375467)
#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[22];
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->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 1;
for(int i=0;i<x->nr_plozi;i++)
if(x->plozi[i]->inf==p[0])
return prefix(p+1,x->plozi[i]);
return strlen(p);
}
void citire()
{
ifstream fin("trie.in");
nod *st = new nod('\0');
char s[100000];
while(fin.getline(s,100000))
{
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",strlen(s)-prefix(s,st));
}
}
int main()
{
freopen("trie.out","w",stdout);
citire();
return 0;
}