Pagini recente » Cod sursa (job #3128345) | Monitorul de evaluare | Cod sursa (job #2702692) | Cod sursa (job #1176798) | Cod sursa (job #476953)
Cod sursa(job #476953)
// Trie.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
#include "stdio.h"
#include "string.h"
FILE *f=fopen("trie.in", "r");
FILE *g=fopen("trie.out", "w");
struct Trie
{
int cnt, nrfii;
Trie *fiu[ 26 ];
Trie()
{
cnt = nrfii = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *t=new Trie;
void insert(Trie *nod, char *c)
{
if (*c=='\n')
{
nod ->cnt++;
return ;
}
if (nod->fiu[*c-'a']==0)
{
nod->fiu[*c-'a']=new Trie;
nod->nrfii++;
}
insert( nod->fiu[ *c-'a' ], c+1 );
}
int sterge(Trie *nod, char *c)
{
if (*c=='\n')
nod->cnt--;
else
{
if (sterge(nod->fiu[*c-'a'], c+1))
{
nod->fiu[*c-'a']=0;
nod->nrfii--;
}
}
if (nod->cnt==0 && nod->nrfii==0 && nod!=t)
{
delete nod;
return 1;
}
return 0;
}
int numar(Trie *nod, char *c)
{
if (*c=='\n')
return nod->cnt;
if (nod->fiu[*c-'a'])
return numar(nod->fiu[*c-'a'], c+1);
return 0;
}
int prefix(Trie *nod, char *c, int k)
{
if (*c=='\n' || nod->fiu[*c-'a']==0)
return k;
return prefix(nod->fiu[*c-'a'], c+1, k+1);
}
int main()
{
char s[32];
fgets(s, 32, f);
while (!feof(f))
{
switch (s[0])
{
case '0': insert(t, s+2); break;
case '1': sterge(t, s+2); break;
case '2': fprintf(g, "%d\n", numar(t, s+2)); break;
case '3': fprintf(g, "%d\n", prefix(t, s+2, 0)); break;
}
fgets(s, 32, f);
}
return 0;
}