Pagini recente » Cod sursa (job #1639269) | Cod sursa (job #369372) | Cod sursa (job #532812) | Cod sursa (job #291425) | Cod sursa (job #1218232)
#include<fstream>
#include<vector>
#include<cstring>
#define ch (*t-'a')
using namespace std;
struct cell
{
int frecv;
int cuv;
cell *e[30];
cell()
{
cuv=0;
frecv=0;
for (int i=0;i<=25;i++) e[i]=NULL;
}
};
ifstream fin("trie.in");
ofstream fout("trie.out");
const int oo=1<<30;
int sol;
char s[30];
cell *root=new cell;
inline void ADAUGA(char *t,cell *p,int i,int len)
{
if (p->e[ch]==NULL) p->e[ch]=new cell;
p->e[ch]->frecv ++;
if (i==len-1) p->e[ch]->cuv ++;
else ADAUGA(t+1,p->e[ch],i+1,len);
}
inline bool STERGE(char *t,cell *q)
{
if (*t==0) {
q->frecv--;
q->cuv --;
}
else{
if (STERGE(t+1,q->e[ch])==1)
{
q->e[ch]=NULL;
}
if (q!=root)
q->frecv--;
}
if (q->frecv==0 && q->cuv==0 && q!=root) {delete q;return 1;}
return 0;
}
inline void COUNT(char *t,cell *p,int i,int len)
{
if (i==len)
{
//fout<<p->cuv<<"\n";
sol=p->cuv;
return ;
}
if (p->e[ch]==NULL)
{
//fout<<"caca";
sol=0;
return ;
}
COUNT(t+1,p->e[ch],i+1,len);
}
inline void PREFIX(char *t,cell *p,int i,int len)
{
if (i==len) fout<<i<<"\n";
else
if (p->e[ch]==NULL) fout<<i<<"\n";
else PREFIX(t+1,p->e[ch],i+1,len);
}
inline void SOLVE()
{
int ok;
while (fin>>ok)
{
fin>>s;
if (!ok) ADAUGA(s,root,0,strlen(s));
if (ok==1) STERGE(s,root);
if (ok==2)
{
sol=oo;
COUNT(s,root,0,strlen(s));
fout<<sol<<"\n";
}
if (ok==3) PREFIX(s,root,0,strlen(s));
}
}
int main()
{
SOLVE();
return 0;
}