Pagini recente » Cod sursa (job #1133892) | Cod sursa (job #1230384) | Cod sursa (job #2444628) | Cod sursa (job #608419) | Cod sursa (job #1165529)
#include <iostream>
#include <fstream>
#include <string.h>
#define LMAX 30
using namespace std;
int n,m;
struct nod
{
int fii,nr;
nod *urm[LMAX];
nod()
{
int i;
nr=fii=0;
for(i=0;i<=26;++i) urm[i]=NULL;
}
} *rad;
char c[30];
int op;
void insert(nod *p)
{
int i,lit;
for(i=0;c[i]!='\0';++i)
{
lit=c[i]-'a';
if (p->urm[lit]==NULL)
{
p->urm[lit]=new nod;
p->fii++;
}
p=p->urm[lit];
}
++p->nr;
}
bool Erase(nod *p,int i)
{
int lit;
if (c[i]=='\0') --p->nr;
else
{
int lit=c[i]-'a';
if (Erase(p->urm[lit],i+1))
{
--p->fii;
p->urm[lit]=NULL;
}
if (p->fii==0 && p->nr==0 && p!=rad)
{
delete p;
return true;
}
return false;
}
}
int tipareste_ap(nod *p)
{
int i,lit;
for(i=0;c[i]!='\0';++i)
{
lit=c[i]-'a';
if (p->urm[lit]==NULL) return 0;
else p=p->urm[lit];
}
return p->nr;
}
int tiparesteprefix(nod *p)
{
int i,lit;
for(i=0;c[i]!='\0';++i)
{
lit=c[i]-'a';
if (p->urm[lit]==NULL) return i;
else p=p->urm[lit];
}
return strlen(c);
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
rad=new nod;
while(f>>op>>c)
{
if (op==0) insert(rad);
else if (op==1) Erase(rad,0);
else if (op==2) g<<tipareste_ap(rad)<<"\n";
else g<<tiparesteprefix(rad)<<"\n";
}
f.close();
g.close();
return 0;
}