Pagini recente » Cod sursa (job #2033424) | Cod sursa (job #2417372) | Cod sursa (job #904084) | Istoria paginii runda/hc_bonus_round | Cod sursa (job #1337483)
#include <fstream>
#include <cstring>
using namespace std;
ifstream is("trie.in");
ofstream os("trie.out");
struct Trie{
Trie()
{
nrcuv = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
int nrcuv, nrfii;
Trie *fiu[26];
};
Trie *t = new Trie;
int tip;
char cuv[30];
void Insert(Trie* nod, char *s);
bool Delete(Trie* nod, char *s);
int Count(Trie* nod, char *s);
int Prefix(Trie* nod, char *s);
int main()
{
while ( is.getline(cuv, 30))
{
tip = cuv[0] - '0';
if ( !tip )
{
Insert(t, cuv + 2);
continue;
}
if ( tip == 1 )
{
Delete(t, cuv + 2);
continue;
}
if ( tip == 2 )
{
os << Count(t, cuv + 2) << "\n";
continue;
}
os << Prefix(t, cuv + 2) << "\n";
}
is.close();
os.close();
return 0;
}
int Prefix(Trie* nod, char *s)
{
if ( *s == '\0' || !nod->fiu[*s - 'a'] )
return 0;
return 1 + Prefix(nod->fiu[*s - 'a'], s + 1);
}
int Count(Trie* nod, char *s)
{
if ( *s == '\0' )
return nod->nrcuv;
if ( nod->fiu[*s - 'a'] )
return Count(nod->fiu[*s - 'a'], s + 1);
return 0;
}
void Insert(Trie* nod, char *s)
{
if ( *s == '\0' )
{
++nod->nrcuv;
return;
}
if ( !nod->fiu[*s - 'a'] )
{
nod->fiu[*s - 'a'] = new Trie;
++nod->nrfii;
}
Insert(nod->fiu[*s - 'a'], s + 1);
}
bool Delete(Trie* nod, char *s)
{
if ( *s == '\0' )
--nod->nrcuv;
else
if ( Delete(nod->fiu[*s - 'a'], s + 1) )
{
nod->fiu[*s - 'a'] = 0;
--nod->nrfii;
}
if ( !nod->nrcuv && !nod->nrfii && nod != t )
{
delete nod;
return true;
}
return false;
}