Nu aveti permisiuni pentru a descarca fisierul grader_test27.in
Cod sursa(job #228467)
Utilizator | Data | 7 decembrie 2008 12:45:26 | |
---|---|---|---|
Problema | Trie | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.04 kb |
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct nod
{
int nr_ap,nr_fin;
nod *sir[26];
nod ()
{
nr_ap=nr_fin=0;
memset(sir,0,sizeof(sir));
}
}*A;
char s[30];
void baga(int lg)
{
nod *Q=A;
for (int i=0;i<lg;i++)
{
if (Q->sir[s[i]-'a']==NULL)
Q->sir[s[i]-'a']=new nod;
Q=Q->sir[s[i]-'a'];
Q->nr_ap++;
}
Q->nr_fin++;
}
void sterge(int lg)
{
nod *Q=A,*Q1;
for (int i=0;i<lg;i++)
{
Q1=Q;
Q=Q->sir[s[i]-'a'];
Q->nr_ap--;
if (Q1->nr_ap==0)
delete Q1;
else
if (Q->nr_ap==0)
Q1->sir[s[i]-'a']=NULL;
}
Q->nr_fin--;
if (Q->nr_ap==0)
delete Q;
}
int nr_aparitii(int lg)
{
nod *Q=A;
for (int i=0;i<lg;i++)
{
if (Q->sir[s[i]-'a']->nr_ap==0)
return 0;
Q=Q->sir[s[i]-'a'];
}
return Q->nr_fin;
}
int pref_max(int lg)
{
nod *Q=A;
for (int i=0;i<lg;i++)
{
if (Q->sir[s[i]-'a']==NULL)
return i;
Q=Q->sir[s[i]-'a'];
}
return 0;
}
int main()
{
int x;
char c;
A=new nod;
A->nr_ap=1;
while (!fin.eof())
{
fin>>x;
fin.get(c);
fin.getline(s,25);
if (!strlen(s))
return 0;
switch (x)
{
case 0:{
baga(strlen(s));
break;
}
case 1:{
sterge(strlen(s));
break;
}
case 2:{
fout<<nr_aparitii(strlen(s))<<"\n";
break;
}
case 3:{
fout<<pref_max(strlen(s))<<"\n";
break;
}
}
}
return 0;
}