Pagini recente » Cod sursa (job #1637277) | Cod sursa (job #2918858) | Cod sursa (job #1410098) | Cod sursa (job #134159) | Cod sursa (job #1389658)
#include <fstream>
#include <cstring>
#define LMAX 31
#define NRCHAR 28
using namespace std;
ifstream f("trie.in");
ifstream c("trie.ok");
ofstream g("trie.out");
int type,poz,nr;
char S[LMAX];
struct boss
{
int nr,fii;
boss *tata,*son[NRCHAR];
}*rad=new boss(),*nod;
inline void add()
{
poz=0;
nod=rad;
while (S[poz])
{
int val=S[poz]-'a';
if (nod->son[val]==0)
{
nod->son[val]=new boss();
nod->son[val]->nr=0;
nod->son[val]->fii=0;
nod->fii++;
for (int i=0;i<NRCHAR;i++)nod->son[val]->son[i]=0;
nod->son[val]->tata=nod;
nod=nod->son[val];
poz++;
continue;
}
nod=nod->son[val];
poz++;
}
nod->nr++;
}
inline void del()
{
int val;
poz=0;
nod=rad;
while (S[poz])
{
val=S[poz]-'a';
if (nod->son[val]==0)
return;
nod=nod->son[val];
poz++;
}
nod->nr--;
if (nod->fii==0 && nod->nr==0)
{nod->tata->fii--;
nod->tata->son[val]=0;
}
}
inline void apar()
{
poz=0;
nod=rad;
while (S[poz])
{
int val=S[poz]-'a';
if (nod->son[val]==0)
{
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';
if (nod->fii==0 || nod->son[val]==0)
break;
poz++;
nod=nod->son[val];
}
g<<poz<<'\n';
}
int main()
{
while (f>>type)
{
nr++;
f>>S;
switch (type){
case 0:{add();continue;};
case 1:{del();continue;};
case 2:{apar();continue;};
case 3:{prefix();continue;};}
}
f.close();
g.close();
}