Pagini recente » Cod sursa (job #457206) | Cod sursa (job #1412410) | Cod sursa (job #2227711) | Cod sursa (job #1750981) | Cod sursa (job #2078475)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("trie.in");
ofstream fout("trie.out");
int t,i,rez;
char c[30];
struct nod{
int info;
int ok;
nod *fiu[26];
};
void reset(nod *lvl)
{
lvl->ok=0;
lvl->info=0;
for(int i=0;i<=25;i++)
lvl->fiu[i]=NULL;
}
void creaza(int niv, nod *lvl)
{
if(c[niv]==0)
return;
int ca=c[niv]-'a';
nod *r;
r=lvl->fiu[ca];
if(r==NULL)
{
r=new nod;
reset(r);
lvl->fiu[ca]=r;
}
r->info++;
if(c[niv+1]==0)
r->ok++;
creaza(niv+1, r);
}
void sterge(int niv, nod *lvl)
{
if(c[niv]==0)
return;
int ca=c[niv]-'a';
nod *r;
r=lvl->fiu[ca];
sterge(niv+1, r);
r->info--;
if(c[niv+1]==0)
r->ok--;
if(r->info==0)
{
delete r;
lvl->fiu[ca]=NULL;
}
}
void cauta1(int niv, nod *lvl)
{
if(c[niv]==0)
return;
int ca=c[niv]-'a';
nod *r;
r=lvl->fiu[ca];
if(r==NULL){
rez=0;
return;
}
if(c[niv+1]==0)
rez=r->ok;
cauta1(niv+1, r);
}
void cauta2(int niv, nod *lvl)
{
if(c[niv]==0)
return;
int ca=c[niv]-'a';
nod *r;
r=lvl->fiu[ca];
if(r==NULL)
return;
if(r->info>0)
rez=max(rez, niv+1);
cauta2(niv+1, r);
}
int main ()
{
nod *baza;
baza=new nod;
reset(baza);
while(fin>>t)
{
fin>>c;
if(t==0)
creaza(0, baza);
if(t==1)
sterge(0, baza);
if(t==2)
{
rez=0;
cauta1(0, baza);
fout<<rez<<"\n";
}
if(t==3)
{
rez=0;
cauta2(0, baza);
fout<<rez<<"\n";
}
}
fin.close();
fout.close();
return 0;
}