Pagini recente » Cod sursa (job #1945257) | Cod sursa (job #1959709) | Cod sursa (job #1139378) | Cod sursa (job #571124) | Cod sursa (job #2089082)
#include <bits/stdc++.h>
#define SIZZ 26
#define SMAX 25
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TRIE
{
int kidz, terminal;
TRIE *son[SIZZ];
TRIE()
{
kidz = terminal = 0;
memset(son, 0, sizeof(son));
}
};
TRIE *root = new TRIE();
void add_word(TRIE *nod, char *poz)
{
if (*poz == NULL)
{
nod -> terminal++;
return;
}
int nxt = *poz - 'a';
if (nod -> son[nxt] == NULL)
{
nod -> son[nxt] = new TRIE();
nod -> kidz++;
}
add_word(nod -> son[nxt], poz + 1);
}
bool erase_word(TRIE *nod, char *poz)
{
if (*poz == NULL)
{
nod -> terminal--;
if (nod -> terminal == 0 && nod -> kidz == 0 && nod != root)
{
delete nod;
return 1;
}
return 0;
}
int nxt = *poz - 'a';
if (erase_word(nod -> son[nxt], poz + 1))
{
nod -> kidz--;
nod -> son[nxt] = 0;
if (nod -> terminal == 0 && nod -> kidz == 0 && nod != root)
{
delete nod;
return 1;
}
}
return 0;
}
int frecventa(TRIE *nod, char *poz)
{
if (*poz == NULL)
return nod -> terminal;
int nxt = *poz - 'a';
if (nod -> son[nxt] == NULL)
return 0;
frecventa(nod -> son[nxt], poz + 1);
}
int prefix(TRIE *nod, char *poz)
{
if (*poz == NULL)
return 0;
int nxt = *poz - 'a';
if (nod -> son[nxt] == NULL)
return 0;
return prefix(nod -> son[nxt], poz + 1) + 1;
}
int main()
{
int op;
char s[SMAX];
while (fin >> op >> s)
{
if (op == 0)
add_word(root, s);
if (op == 1)
erase_word(root, s);
if (op == 2)
fout << frecventa(root, s) << "\n";
if (op == 3)
fout << prefix(root, s) << "\n";
}
fin.close();
fout.close();
return 0;
}