Pagini recente » Cod sursa (job #2718883) | Cod sursa (job #1229676) | Cod sursa (job #1639131) | Cod sursa (job #367431) | Cod sursa (job #1389261)
#include <fstream>
#include <cstring>
#define LMAX 31
#define NRCHAR 27
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int type,poz;
char S[LMAX];
struct boss
{
int nr,fii;
boss *tata,*son[NRCHAR];
boss(){
nr=fii=0;
memset(son,NULL,sizeof(son));}
}*rad=new boss(),*nod;
inline void add()
{
poz=0;
nod=rad;
while (S[poz])
{
int val=S[poz]-'a';
if (nod->son[val]==NULL)
{
nod->son[val]=new boss();
nod->son[val]->nr=0;
nod->fii++;
nod->son[val]->tata=nod;
nod=nod->son[val];
poz++;
continue;
}
nod=nod->son[val];
poz++;
}
nod->nr++;
}
inline void del()
{
poz=0;
nod=rad;
while (S[poz])
{
int val=S[poz]-'a';
if (nod->son[val]==NULL)
return;
nod=nod->son[val];
poz++;
}
nod->nr--;
if (nod->fii==0 && nod->nr==0)
{nod->tata->fii--;
if (nod->tata->fii==0)
delete nod->tata;
delete nod;
}
}
inline void apar()
{
poz=0;
nod=rad;
while (S[poz])
{
int val=S[poz]-'a';
if (nod->son[val]==NULL)
{
g<<0<<'\n';
return;
}
nod=nod->son[val];
poz++;
}
g<<nod->nr<<'\n';
}
inline void prefix()
{
poz=0;
nod=rad;
while (S[poz] && nod)
{
int val=S[poz]-'a';
poz++;
if (nod->fii==0 || nod->son[val]==NULL)
break;
nod=nod->son[val];
}
g<<poz-1<<'\n';
}
int main()
{
while (f>>type)
{
f>>S;
switch (type){
case 0:{add();continue;};
case 1:{del();continue;};
case 2:{apar();continue;};
case 3:{prefix();continue;};}
}
f.close();
g.close();
}