Pagini recente » Cod sursa (job #665097) | Cod sursa (job #1490374) | Istoria paginii runda/infoabc_9/clasament | Cod sursa (job #2144247) | Cod sursa (job #1946688)
#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;
}