Pagini recente » Borderou de evaluare (job #1594457) | Cod sursa (job #1967300)
#include<fstream>
#define NMAX 21
using namespace std;
int op;
char s[NMAX];
struct trie
{
int na;
int nf;
trie *fiu[26];
trie()
{
na = nf = 0;
for(int i = 0; i < 25; i++)
{
fiu[i] = NULL;
}
}
};
trie *rad;
void inserare(trie *nod, char *s)
{
if(*s == NULL)
{
nod -> na++;
return;
}
if(nod -> fiu[*s - 'a'] == NULL)
{
nod -> fiu[*s - 'a'] = new trie;
nod -> nf++;
}
inserare(nod -> fiu[*s - 'a'], s + 1);
}
int aparitii(trie *nod, char *s)
{
if(*s == NULL)
{
return nod -> na;
}
if(nod -> fiu[*s - 'a'] == NULL)
{
return 0;
}
return aparitii(nod -> fiu[*s - 'a'], s + 1);
}
int prefix(trie *nod, char *s)
{
if(*s == NULL)
{
return 0;
}
if(nod -> fiu[*s - 'a'] == NULL)
{
return 0;
}
return 1 + prefix(nod -> fiu[*s - 'a'], s + 1);
}
bool sterge(trie *nod, char *s)
{
if(*s == NULL)
{
nod -> na--;
if(nod -> na == 0 && nod -> nf == 0 && nod != rad)
{
delete nod;
return 1;
}
return 0;
}
if(nod -> fiu[*s - 'a'] == NULL)
{
return 0;
}
if(sterge(nod -> fiu[*s - 'a'], s + 1))
{
nod -> fiu[*s - 'a'] = NULL;
nod -> nf--;
if(nod -> na == 0 && nod -> nf == 0 && nod != rad)
{
delete nod;
return 1;
}
return 0;
}
return 0;
}
ifstream _cin("trie.in");
ofstream _cout("trie.out");
int main()
{
rad = new trie;
while(_cin >> op)
{
_cin >> s;
if(op == 0)
{
inserare(rad, s);
continue;
}
if(op == 1)
{
sterge(rad, s);
continue;
}
if(op == 2)
{
_cout << aparitii(rad, s) << "\n";
continue;
}
_cout << prefix(rad, s) << "\n";
}
return 0;
}