Pagini recente » Cod sursa (job #3195725) | Cod sursa (job #784746) | Cod sursa (job #1627427) | Cod sursa (job #2003786) | Cod sursa (job #595730)
Cod sursa(job #595730)
#include <iostream>
#include <cstdio>
using namespace std;
struct Trie
{
int NCuv;
int NFii;
Trie *Fiu[26];
Trie ()
{
NCuv=0;
NFii=0;
memset (Fiu, 0, sizeof (Fiu));
}
};
Trie *T=new Trie;
void Insert (Trie *Nod, char *Litera)
{
if (*Litera=='\n')
{
Nod -> NCuv++;
return;
}
if (Nod -> Fiu [*Litera-'a']==0)
{
Nod -> Fiu [*Litera-'a']=new Trie;
Nod -> NFii++;
}
Insert (Nod -> Fiu[*Litera-'a'], Litera+1);
}
int Delete (Trie *Nod, char *Litera)
{
if (*Litera=='\n')
{
Nod -> NCuv--;
}
else
{
if (Delete (Nod -> Fiu[*Litera-'a'], Litera+1)==1)
{
Nod -> NFii--;
Nod -> Fiu[*Litera-'a']=0;
}
}
if ((Nod -> NCuv==0)&&(Nod -> NFii==0)&&(Nod!=T))
{
delete Nod;
return 1;
}
return 0;
}
int Prefix (Trie *Nod, char *Litera, int L)
{
if ((*Litera=='\n')||(Nod -> Fiu[*Litera-'a']==0))
{
return L;
}
return Prefix (Nod -> Fiu[*Litera-'a'], Litera+1, L+1);
}
int Query (Trie *Nod, char *Litera)
{
if (*Litera=='\n')
{
return Nod -> NCuv;
}
if (Nod -> Fiu[*Litera-'a']!=0)
{
return Query (Nod -> Fiu[*Litera-'a'], Litera+1);
}
return 0;
}
int main()
{
FILE *fin = fopen ("trie.in", "r");
FILE *fout = fopen ("trie.out", "w");
char Cuvant[25];
int Tip;
while (fscanf (fin, "%d", &Tip)!=EOF)
{
fscanf (fin, "%s", &Cuvant);
strcat (Cuvant, "\n\0");
switch (Tip)
{
case 0 : Insert (T, Cuvant);
break;
case 1 : Delete (T, Cuvant);
break;
case 2 : fprintf (fout, "%d\n", Query (T, Cuvant));
break;
case 3 : fprintf (fout, "%d\n", Prefix (T, Cuvant, 0));
break;
default: break;
}
}
fclose (fin);
fclose (fout);
return 0;
}