Cod sursa(job #1946688)

Utilizator xraven78Eduard Mihes xraven78 Data 30 martie 2017 12:40:53
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <fstream>
#include <cstring>
using namespace std;
ofstream out("trie.out");

struct Trie
{
int Count,nr_Sons;
Trie* son[26];
Trie()
{
Count = nr_Sons = 0;
memset(son, 0, sizeof(son));
}
};
Trie* T = new Trie;

void Insert(Trie* node, char* s)
{
if(*s == '\n')
{
node->Count++;
return;
}

if(node->son[*s-'a'] == 0)
{
node->son[*s-'a'] = new Trie;
node->nr_Sons++;
}
Insert(node->son[*s-'a'], s+1);
}
bool Delete(Trie* node, char* s)
{
if(*s == '\n')
node->Count--;
else if(Delete(node->son[*s-'a'], s+1))
{node->son[*s-'a'] = 0;
node->nr_Sons--;
}

if(node->Count == 0 & node->nr_Sons == 0 & node != T)
{
delete node; return 1;
}
return 0;
}
int query(Trie* node, char* s)
{if(*s == '\n')
return node->Count;
if(node->son[*s-'a'])
return query(node->son[*s-'a'],s+1);
return 0;
}
int prefix(Trie* node, char* s, int k)
{
if(*s == '\n' || node->son[*s-'a'] == 0)
return k;
return prefix(node->son[*s-'a'],s+1,k+1);
}

int main()
{char line[23];
freopen("trie.in", "r", stdin);
fgets(line, 23, stdin);
while(!feof(stdin))
{
switch(line[0])
{ case '0': Insert(T, line+2); break;
case '1': Delete(T, line+2); break;
case '2': out << query(T, line+2) << "\n"; break;
case '3': out << prefix(T, line+2, 0) << "\n"; break;
}
fgets(line, 23, stdin);
}return 0;
}