Pagini recente » Cod sursa (job #1335400) | Cod sursa (job #1219803) | Cod sursa (job #2566586) | Cod sursa (job #2570005) | Cod sursa (job #2217919)
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie
{
int cnt, nrfii;
Trie *fiu[26];
//
Trie()
{
cnt = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *T = new Trie;
void insert(Trie *nod, char *s)
{
if(*s == NULL)
{
nod->cnt++;
return;
}
if(nod->fiu[*s - 'a'] == 0)
{
nod->fiu[*s - 'a'] = new Trie;
nod->nrfii++;
}
insert(nod->fiu[*s - 'a'], s + 1);
}
bool erase(Trie *nod, char *s)
{
if(*s == NULL)
nod->cnt--;
else if(erase(nod->fiu[*s - 'a'], s + 1))
{
nod->fiu[*s - 'a'] = 0;
nod->nrfii--;
}
if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod;
return true;
}
return false;
}
int fr(Trie *nod, char *s)
{
if(*s == NULL)
return nod->cnt;
if(nod->fiu[*s - 'a'])
return fr(nod->fiu[*s - 'a'], s + 1);
return 0;
}
int prefix(Trie *nod, char *s, int k)
{
if(*s == NULL || nod->fiu[*s - 'a'] == 0)
return k;
return prefix(nod->fiu[*s - 'a'], s + 1, k + 1);
}
int main()
{
int op;
char word[21];
while(in >> op >> word)
{
switch(op)
{
case 0:
insert(T, word);
break;
case 1:
erase(T, word);
break;
case 2:
out << fr(T, word) << '\n';
break;
case 3:
out << prefix(T, word, 0) << '\n';
break;
}
}
return 0;
}