Pagini recente » Cod sursa (job #397077) | Cod sursa (job #1770807) | Cod sursa (job #2878604) | Cod sursa (job #1607603) | Cod sursa (job #1577586)
#include <fstream>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
ifstream is("trie.in");
ofstream os("trie.out");
struct Trie
{
Trie() : nrfii(0), nrcuv(0)
{
memset(fii, 0, sizeof(fii));
}
int nrfii, nrcuv;
Trie *fii[26];
} *t = new Trie;
char s[22];
void Insert(Trie *nod, char *cuv);
bool Delete(Trie *nod, char *cuv);
void Count(Trie *nod, char *cuv);
void Prefix(Trie *nod, char *cuv, int k);
int main()
{
while ( is.getline(s, 22, '\n') )
{
switch(s[0])
{
case '0': Insert(t, s + 2); break;
case '1': Delete(t, s + 2); break;
case '2': Count(t, s + 2); break;
case '3': Prefix(t, s + 2, 0); break;
}
}
is.close();
os.close();
return 0;
}
void Prefix(Trie *nod, char *cuv, int k)
{
if ( *cuv == '\0' || !nod->fii[*cuv - 'a'] )
{
os << k << "\n";
return;
}
Prefix(nod->fii[*cuv - 'a'], cuv + 1, k + 1);
}
void Count(Trie *nod, char *cuv)
{
if ( *cuv == '\0' )
{
os << nod->nrcuv << "\n";
return;
}
if ( nod->fii[*cuv - 'a'] )
Count(nod->fii[*cuv - 'a'], cuv + 1);
else
os << "0\n";
}
bool Delete(Trie *nod, char *cuv)
{
if ( *cuv == '\0' )
{
--nod->nrcuv;
if ( !nod->nrfii && !nod->nrcuv )
{
delete nod;
return true;
}
return false;
}
if ( Delete(nod->fii[*cuv - 'a'], cuv + 1) )
{
nod->fii[*cuv - 'a'] = 0;
--nod->nrfii;
if ( !nod->nrfii && !nod->nrcuv && nod != t )
{
delete nod;
return true;
}
}
return false;
}
void Insert(Trie *nod, char *cuv)
{
if ( *cuv == '\0' )
{
++nod->nrcuv;
return;
}
if ( !nod->fii[*cuv - 'a'] )
{
nod->fii[*cuv - 'a'] = new Trie;
++nod->nrfii;
}
Insert(nod->fii[*cuv - 'a'], cuv + 1);
}