Pagini recente » Cod sursa (job #2366016) | Cod sursa (job #2282727) | Cod sursa (job #2664588) | Cod sursa (job #343115) | Cod sursa (job #590339)
Cod sursa(job #590339)
#include <stdio.h>
#include <fstream.h>
#include <string.h>
ifstream fin("trie.in");
FILE *g=fopen ("trie.out", "w");
struct trie { int nr,fii;
trie *v[30]; } *rad,*p;
int sw,n;
char s[25];
void setare (trie *&p)
{
for (int i=0;i<=25;i++)
p->v[i]=NULL;
p->nr=0; p->fii=0;
}
void update (trie *&p, int i) {
if (i==n)
{
p->nr++;
return;
}
if (!p->v[s[i]-97])
{
p->v[s[i]-97]=new trie;
setare(p->v[s[i]-97]);
p->fii++;
}
update (p->v[s[i]-97], i+1);
}
int del (trie *&p, int i)
{
if (i==n)
{
p->nr--;
if (p->nr ==0 && p->fii==0 && p!=rad)
{
delete p; p=NULL;
return -1;
}
return 0;
}
p->fii+=del (p->v[s[i]-97], i+1);
return 0;
}
void number (trie *p, int i)
{
if (!p)
{ fprintf (g, "0\n"); return; }
if (i<n) number (p->v[s[i]-97], i+1);
else fprintf (g, "%d\n", p->nr);
}
void prefix (trie *p, int i)
{
if (i==n || !p->v[s[i]-97])
{ fprintf (g, "%d\n", i); return; }
prefix (p->v[s[i]-97], i+1);
}
int main() {
rad=new trie;
setare(rad);
while (fin>>sw)
{
fin>>s; n=strlen(s);
if (sw==0) update (rad, 0);
if (sw==1) int x=del (rad, 0);
if (sw==2) number (rad, 0);
if (sw==3) prefix (rad, 0);
}
return 0;
}