Pagini recente » Cod sursa (job #621556) | Cod sursa (job #2942600)
#include <iostream>
#include <fstream>
#define ch (*s - 'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int t;
char s[30];
struct Trie
{
int nr_cuv;
int nr_fii;
Trie *fiu[30];
Trie()
{
nr_cuv = nr_fii = 0;
for (int i = 0; i < 26; i++)
fiu[i] = 0;
}
};
Trie *T = new Trie;
void Add(Trie *nod, char *s)
{
if (*s == 0)
{
nod->nr_cuv++;
return;
}
if(nod->fiu[ch] == 0)
{
nod->fiu[ch] = new Trie;
nod->nr_fii++;
}
Add(nod->fiu[ch], s+1);
}
bool Delete(Trie *nod, char *s)
{
if(*s == 0)
nod->nr_cuv--;
else
{
if(Delete(nod->fiu[ch], s+1))
{
nod->fiu[ch] = 0;
nod->nr_fii--;
}
}
if(nod->nr_fii == 0 && nod->nr_cuv == 0 && nod != T)
{
delete nod;
return true;
}
return false;
}
int Query(Trie *nod, char *s)
{
if(*s == 0)
return nod->nr_cuv;
if(nod->fiu[ch] != 0)
return Query(nod->fiu[ch], s+1);
return 0;
}
int Prefix(Trie *nod, char *s, int len)
{
if(*s == 0 || nod->fiu[ch] == 0)
return len;
return Prefix(nod->fiu[ch], s+1, len+1);
}
int main()
{
while (fin >> t >> s)
{
if(t == 0)
Add(T, s);
else if(t == 1)
Delete(T, s);
else if(t == 2)
fout << Query(T, s) << "\n";
else if(t == 3)
fout << Prefix(T, s, 0) << "\n";
}
return 0;
}