Pagini recente » Cod sursa (job #1857990) | Cod sursa (job #2079663) | Cod sursa (job #1167574) | Cod sursa (job #818612) | Cod sursa (job #1812812)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
class Trie
{
public :
int val, nr_fii;
Trie *fiu[ 26 ];
Trie()
{
val = nr_fii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
char line[32];
Trie *T = new Trie;
void Ins(Trie *nod, char *s)
{
if (*s == '\0')
{
nod->val += 1;
return;
}
if (nod->fiu[*s - 'a'] == '\0')
{
nod->fiu[*s - 'a'] = new Trie;
nod->nr_fii += 1;
}
Ins(nod->fiu[*s - 'a'], s + 1);
}
bool Del(Trie *nod, char *s)
{
if (*s == '\0')
{
nod->val -= 1;
}
else if (Del(nod->fiu[*s - 'a'], s + 1))
{
nod->fiu[*s - 'a'] = '\0';
nod->nr_fii -= 1;
}
if (nod->val == 0 && nod->nr_fii == 0 && nod != T)
{
delete nod;
return true;
}
return false;
}
int Nr_Ap(Trie *nod, char *s)
{
if (*s == '\0')
{
return nod->val;
}
if (nod->fiu[*s - 'a'] != '\0')
{
return Nr_Ap(nod->fiu[*s - 'a'], s + 1);
}
return 0;
}
int Max_Pref(Trie *nod, char *s, int k)
{
if (*s == '\0' || nod->fiu[*s - 'a'] == '\0')
{
return k;
}
return Max_Pref(nod->fiu[*s - 'a'], s + 1, k + 1);
}
int main()
{
while(fin.get(line, 30, '\n'))
{
switch (line[0])
{
case '0' :
{
Ins(T, line + 2);
break;
}
case '1' :
{
Del(T, line + 2);
break;
}
case '2' :
{
fout << Nr_Ap(T, line + 2) << '\n';
break;
}
case '3' :
{
fout << Max_Pref(T, line + 2, 0) << '\n';
break;
}
}
fin.get();
}
fout.close();
return 0;
}