Pagini recente » Istoria paginii runda/warmup2/clasament | Cod sursa (job #174575) | Istoria paginii runda/concurs | Cod sursa (job #125097) | Cod sursa (job #2021673)
#include<fstream>
#include<string>
using namespace std;
ifstream is("trie.in");
ofstream os("trie.out");
struct TRIE
{
int nr_cuv;
int nr_fii;
TRIE* Next[27];
};
TRIE* Root;
void Add(char* c, TRIE* T);
void Remove(char* c, TRIE* T);
int Count(char* c, TRIE* T);
int Prefix(char* c, TRIE* T);
int main()
{
int op;
char c[21];
Root = new TRIE();
while (is >> op >> c)
{
switch (op)
{
case 0: Add(c, Root); break;
case 1: Remove(c, Root); break;
case 2: os << Count(c, Root) << '\n'; break;
case 3: os << Prefix(c, Root) << '\n'; break;
}
}
is.close();
os.close();
return 0;
}
void Add(char* c, TRIE* T)
{
if (c[0] == 0 )
{
T->nr_cuv++;
return;
}
if (T->Next[c[0] - 97] == NULL)
{
T->Next[c[0] - 97] = new TRIE();
T->nr_fii++;
}
Add(c+1, T->Next[c[0] - 97]);
}
void Remove(char* c, TRIE* T)
{
if (c[0] == 0)
{
T->nr_cuv--;
return;
}
Remove(c+1, T->Next[c[0] - 97]);
if (T->Next[c[0] - 97]->nr_cuv == 0 && T->Next[c[0] - 97]->nr_fii == 0)
{
//delete T->Next[c[0] - 97];
T->Next[c[0] - 97] = NULL;
T->nr_fii--;
return;
}
}
int Count(char* c, TRIE* T)
{
if (T == NULL)
return 0;
if (c[0] == 0)
return T->nr_cuv;
return Count(c+1, T->Next[c[0] - 97]);
}
int Prefix(char* c, TRIE* T)
{
if (T->Next[c[0] - 97] == NULL || c[0] == 0)
return 0;
return Prefix(c+1, T->Next[c[0] - 97]) + 1;
}