Pagini recente » Cod sursa (job #514821) | Cod sursa (job #1379835) | Cod sursa (job #275888) | Cod sursa (job #2210550) | Cod sursa (job #1389688)
#include <fstream>
#include <cstring>
#define LMAX 35
#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]==NULL)
{
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]=NULL;
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]==NULL)
return;
nod=nod->son[val];
poz++;
}
nod->nr--;
if (nod->fii==0 && nod->nr==0)
{nod->tata->fii--;
nod->tata->son[val]=NULL;
nod=nod->tata;
}
}
inline void apar()
{
poz=0;
nod=rad;
while (S[poz])
{
int val=S[poz]-'a';
if (nod->son[val]==NULL)
{
int corect;
c>>corect;
//g<<0<<'\n';
return;
}
nod=nod->son[val];
poz++;
}
// int corect;
// c>>corect;
// if (corect!=nod->nr)g<<2<<" "<<nod->nr<<" "<<corect<<" "<<nr<<'\n';
g<<nod->nr<<'\n';
}
inline void prefix()
{
poz=0;
nod=rad;
while (S[poz] && nod->fii)
{
int val=S[poz]-'a';
if (nod->fii==0 || nod->son[val]==NULL)
break;
poz++;
nod=nod->son[val];
}
//int corect;
// c>>corect;
// if (corect!=poz)g<<3<<" "<<poz<<" "<<corect<<" "<<nr<<'\n';
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();
}