Pagini recente » Cod sursa (job #749998) | Cod sursa (job #684196) | Cod sursa (job #677851) | Cod sursa (job #754195) | Cod sursa (job #756103)
Cod sursa(job #756103)
#include <fstream>
using namespace std;
struct TNod;
typedef TNod *PNod;
struct TNod
{
long Aparitii;
long SubAparitii;
PNod Copii[26];
};
PNod T;
PNod CreazaNod(void)
{
PNod res = new TNod;
res->Aparitii = 0;
res->SubAparitii = 0;
long i;
for (i = 0;i < 26;i += 1)
{
res->Copii[i] = 0;
}
return res;
}
void Adauga(PNod &N,char *cuv)
{
if (N == 0)
{
N = CreazaNod();
}
if (cuv[0] == 0)
{
N->Aparitii += 1;
}
else
{
N->SubAparitii += 1;
Adauga(N->Copii[cuv[0] - 'a'],cuv + 1);
}
}
void Sterge(PNod &N,char *cuv)
{
if (cuv[0] == 0)
{
N->Aparitii -= 1;
}
else
{
Sterge(N->Copii[cuv[0] - 'a'],cuv + 1);
N->SubAparitii -= 1;
}
if ((N->Aparitii == 0) && (N->SubAparitii == 0))
{
delete N;
N = 0;
}
}
void Tipareste(PNod &N,char *cuv,fstream &fout)
{
if (N == 0)
{
fout << "0\n";
return ;
}
if (cuv[0] == 0)
{
fout << N->Aparitii << "\n";
}
else
{
Tipareste(N->Copii[cuv[0] - 'a'],cuv + 1,fout);
}
}
long Prefix(PNod &N,char *cuv,long len,fstream &fout)
{
if (cuv[0] == 0)
{
if (N != 0)
{
if ((N->Aparitii > 0) || (N->SubAparitii > 0))
{
fout << len << "\n";
return 0;
}
}
return 1;
}
else
{
if (N->Copii[cuv[0] - 'a'] == 0)
{
if ((N->Aparitii > 0) || (N->SubAparitii > 0))
{
fout << len << "\n";
return 0;
}
return 1;
}
if (Prefix(N->Copii[cuv[0] - 'a'],cuv + 1,len + 1,fout) != 0)
{
if ((N->Aparitii > 0) || (N->SubAparitii > 0))
{
fout << len << "\n";
return 0;
}
return 1;
}
return 0;
}
}
int main(void)
{
fstream fin("trie.in",ios::in);
fstream fout("trie.out",ios::out);
char linie[256],cuv[250];
long op;
while (!fin.eof())
{
fin.getline(linie,250);
if (sscanf(linie,"%ld %s",&op,cuv) != 2)
{
break;
}
switch (op)
{
case 0 :
{
Adauga(T,cuv);
}
break;
case 1 :
{
Sterge(T,cuv);
}
break;
case 2 :
{
Tipareste(T,cuv,fout);
}
break;
case 3 :
{
if (Prefix(T,cuv,0,fout) != 0)
{
fout << "0\n";
}
}
break;
};
}
fin.close();
fout.close();
return 0;
}