Pagini recente » Cod sursa (job #1204692) | Monitorul de evaluare | Cod sursa (job #165289) | Cod sursa (job #2410088) | Cod sursa (job #940638)
Cod sursa(job #940638)
#include <fstream>
#include <cstring>
using namespace std;
struct Trie
{
int cnt, nr_fii;
Trie* F[26];
Trie ()
{
cnt = nr_fii = 0;
memset (F, 0, sizeof (F));
}
};
Trie *T = new Trie;
void Add_Word (char* v, Trie* nod)
{
if (*v == '\0')
{
nod -> cnt++;
return;
}
if (nod -> F[*v - 'a'] == 0)
{
Trie* aux = new Trie;
nod -> F[*v - 'a'] = aux;
nod -> nr_fii++;
}
Add_Word (v + 1, nod -> F[*v - 'a']);
}
void Erase_Word (char* v, Trie* nod)
{
if (*v == '\0')
{
nod -> cnt--;
return;
}
Erase_Word (v + 1, nod -> F[*v - 'a']);
if (nod -> F[*v - 'a'] -> nr_fii == 0 && nod -> F[*v - 'a'] -> cnt == 0) delete (nod -> F[*v - 'a']), nod -> F[*v - 'a'] = 0, nod -> nr_fii--;
}
int Find_Word (char* v, Trie* nod)
{
if (nod == 0) return 0;
if (*v == '\0') return nod -> cnt;
return Find_Word (v + 1, nod -> F[*v - 'a']);
}
int Find_Prefix (char* v, Trie* nod)
{
if (*v == '\0') return 0;
if (nod -> F[*v - 'a'] == 0) return 0;
return 1 + Find_Prefix (v + 1, nod -> F[*v - 'a']);
}
int main ()
{
int a;
char v[25];
ifstream fin ("trie.in");
ofstream fout ("trie.out");
while (1)
{
fin >> a;
if (fin.eof ()) break;
fin >> v;
if (a == 0) Add_Word (v, T);
else if (a == 1) Erase_Word (v, T);
else if (a == 2) fout << Find_Word (v, T) << "\n";
else fout << Find_Prefix (v, T) << "\n";
}
fin.close ();
fout.close ();
return 0;
}