Pagini recente » Istoria paginii runda/horatiu01 | Cod sursa (job #2032737) | Istoria paginii runda/joi_ora12.00 | tema | Cod sursa (job #1339579)
#include <fstream>
#include <cstring>
using namespace std;
ifstream is("trie.in");
ofstream os("trie.out");
struct Trie{
int NrCuv, NrFii;
Trie* Fiu[26];
Trie()
{
NrCuv = NrFii = 0;
memset(Fiu, 0, sizeof(Fiu));
}
};
Trie *T = new Trie;
void AddWord(Trie* t, char* s);
bool DelWord(Trie* t, char* s);
void NrWord(Trie* t, char* s);
int NrPref(Trie* t, char* s, int l);
int op, ap;
char c[21];
int main()
{
while ( is >> op )
{
is >> c;
switch ( op )
{
case 0 : AddWord(T, c); break;
case 1 : DelWord(T, c); break;
case 2 : ap = 0;
NrWord(T, c);
os << ap << '\n';
break;
case 3 : os << NrPref(T, c, 0) << '\n'; break;
}
}
is.close();
os.close();
return 0;
}
void AddWord(Trie* t, char* s)
{
if ( s[0] == 0 )
{
t->NrCuv++;
return;
}
if ( t->Fiu[s[0]-97] == 0 )
{
t->NrFii++;
t->Fiu[s[0]-97] = new Trie;
}
AddWord(t->Fiu[s[0]-97], s+1);
}
bool DelWord(Trie* t, char* s)
{
if ( s[0] == 0 )
t->NrCuv--;
else if ( DelWord( t->Fiu[s[0]-97], s+1 ) )
{
t->NrFii--;
t->Fiu[s[0]-97] = 0;
}
if ( t->NrCuv == 0 && t->NrFii == 0 && t != T )
{
delete t;
return true;
}
return false;
}
void NrWord(Trie* t, char* s)
{
if ( s[0] == 0 )
{
ap += t->NrCuv;
return;
}
else if ( t->Fiu[s[0]-97] != 0)
NrWord(t->Fiu[s[0]-97], s+1);
}
int NrPref(Trie* t, char* s, int l)
{
if ( t->Fiu[s[0]-97] == 0 )
return l;
return NrPref(t->Fiu[s[0]-97], s+1, l+1);
}