Pagini recente » Cod sursa (job #1070794) | Cod sursa (job #2501028) | Cod sursa (job #2958241) | Cod sursa (job #1018122) | Cod sursa (job #1387257)
#include <fstream>
#include <cstring>
#define LMAX 21
#define NR_CHAR 26
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int tip;
char S[LMAX];
struct boss{
int ap,fii;
boss *bossu,*son[NR_CHAR];
boss(){
ap=fii=0;
memset(son,0,sizeof(son));
}
}*rad,*nod,*aux;
inline void insert_trie()
{
int poz=0;
nod=rad;
while (S[poz])
{
if (nod->son[S[poz]-'a']==NULL)
{
aux=new boss;
aux->ap=0;
aux->bossu=nod;
nod->son[S[poz]-'a']=aux;
}
nod=nod->son[S[poz]-'a'];
nod->fii++;
poz++;
}
nod->ap++;
}
inline void erase_trie()
{
int poz=0;
nod=rad;
while (S[poz])
{
nod=nod->son[S[poz]-'a'];
poz++;
}
nod->ap--;
if (nod->ap==0)
nod->bossu->fii--;
}
inline void nr_ap()
{
int poz=0;
nod=rad;
while (S[poz])
{
if (nod->son[S[poz]-'a']==NULL)break;
nod=nod->son[S[poz]-'a'];
poz++;
}
if (S[poz])
g<<0<<'\n';
else
g<<nod->ap<<'\n';
}
inline void find_prefix()
{
int poz=0;
nod=rad;
while (nod->son[S[poz]-'a'] && S[poz])
{
nod=nod->son[S[poz]-'a'];
poz++;
}
g<<poz<<'\n';
}
int main()
{
rad=new boss;
rad->ap=0;
while (f>>tip)
{
f>>S;
switch (tip){
case 0: {insert_trie();break;}
case 1: {erase_trie();break;}
case 2: {nr_ap();break;}
case 3: {find_prefix();break;}
}
}
f.close();
g.close();
}