Pagini recente » Cod sursa (job #1544404) | Cod sursa (job #1503771) | Cod sursa (job #838895) | Cod sursa (job #461018) | Cod sursa (job #2032844)
#include <fstream>
#define in "trie.in"
#define out "trie.out"
#define LG 23
#define ALF 30
using namespace std;
ifstream fin(in);
ofstream fout(out);
struct Trie{
int nrf,cnt;
Trie *fii[ALF];
Trie()
{
nrf = cnt = 0;
for(int i=0; i<ALF; ++i)
fii[i] = NULL;
}
};
char s[LG],*p;
int op;
Trie *f = new Trie;
inline void adauga(Trie *nod)
{
if(*p == '\0')
{
(nod->cnt)++;
return;
}
int ch = *p - 'a';
if(nod->fii[ch] == NULL)
{
nod->fii[ch] = new Trie;
(nod->nrf)++;
}
++p;
adauga(nod->fii[ch]);
}
inline bool sterge(Trie *nod)
{
int ch = *p - 'a';
if(*p == '\0')
{
-- nod->cnt;
}
else{
++p;
if(sterge(nod->fii[ch]) == 1)
{
nod -> fii[ch] = NULL;
-- nod -> nrf;
}
}
if(nod->cnt == 0 && nod->nrf == 0 && nod != f){
delete nod;
return 1;
}
return 0;
}
inline int aparitii(Trie *nod)
{
if(*p == '\0')
return nod -> cnt;
int ch = *p - 'a';
++p;
if(nod -> fii[ch] == NULL) return 0;
return aparitii(nod -> fii[ch]);
}
inline int prefix(Trie *nod)
{
if(*p == '\0') return 0;
int ch = *p - 'a';
++p;
if(nod -> fii[ch] == NULL) return 0;
return 1 + prefix(nod -> fii[ch]);
}
int main()
{
while(fin>>op)
{
fin>>s;
p = s;
if(op == 0)
adauga(f);
else if(op == 1)
sterge(f);
else if(op == 2)
fout<<aparitii(f)<<"\n";
else
fout<<prefix(f)<<"\n";
}
fin.close(); fout.close();
return 0;
}