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