Pagini recente » Cod sursa (job #917573) | Cod sursa (job #1106020) | Cod sursa (job #3220888) | Cod sursa (job #504391) | Cod sursa (job #1339016)
#include <fstream>
#include <cstring>
using namespace std;
ifstream is("trie.in");
ofstream os("trie.out");
struct Trie{
Trie()
{
cnt = nrfii = 0;
memset(fii, 0, sizeof(fii));
}
int cnt, nrfii;
Trie *fii[26];
};
Trie *T = new Trie;
int op;
void Insert(Trie *node, char *s);
bool Delete(Trie *node, char *s);
int Queue(Trie *node, char *s);
int Prefix(Trie *node, char *s, int k);
int main()
{
char cuv[32];
while ( is.getline(cuv, 32) )
{
op = cuv[0] - '0';
switch( op )
{
case 0 :
Insert(T, cuv + 2);
break;
case 1 :
Delete(T, cuv + 2);
break;
case 2 :
os << Queue(T, cuv + 2) << '\n';
break;
case 3 :
os << Prefix(T, cuv + 2, 0) << '\n';
break;
}
}
is.close();
os.close();
return 0;
}
void Insert(Trie *node, char *s)
{
if ( *s == '\0' )
{
node->cnt++;
return;
}
if ( node->fii[*s - 'a'] == 0 )
{
node->fii[*s - 'a'] = new Trie;
node->nrfii++;
}
Insert(node->fii[*s - 'a'], s + 1);
}
bool Delete(Trie *node, char *s)
{
if ( *s == '\0' )
node->cnt--;
else
if ( Delete(node->fii[*s - 'a'], s + 1) )
{
node->fii[*s - 'a'] = 0;
node->cnt--;
}
if ( !node->cnt && !node->nrfii && node != T )
{
delete node;
return 1;
}
return 0;
}
int Queue(Trie *node, char *s)
{
if ( *s == '\0' )
return node->cnt;
if ( node->fii[*s - 'a'] )
return Queue(node->fii[*s - 'a'], s + 1);
return 0;
}
int Prefix(Trie *node, char *s, int k)
{
if ( *s == '\0' || !node->fii[*s - 'a'] )
return k;
return Prefix(node->fii[*s - 'a'], s + 1, k + 1);
}