Pagini recente » Cod sursa (job #939130) | Cod sursa (job #2672373) | Cod sursa (job #1519434) | Cod sursa (job #2615947) | Cod sursa (job #1957901)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie{
int cnt, nrsons;
Trie *son[26];
Trie() //constructor
{
cnt = nrsons = 0;
for (int i = 0; i <= 25; ++i)
son[i] = 0;
}
};
Trie *T = new Trie;
void insereaza(Trie * nod, char s[])
{
if (*s < 'a' || *s > 'z') //daca aici se termina cuvantul
{
++(nod -> cnt); //marcam
return ;
}
if (nod -> son [(*s - 'a')] == 0) //daca n-am creat o prelungire pe litera s[curent]
{
nod -> son [(*s - 'a')] = new Trie; //cream si crestem nr de fii a nodului curent
++(nod -> nrsons);
}
insereaza (nod -> son[(*s - 'a')], s + 1); //continuam recursiv in inserare
}
int stergere(Trie * nod, char s[])
{
if (*s < 'a' || *s > 'z') //daca aici se termina cuvantul
--(nod -> cnt); //marcam stergerea invers fata de inserare
else if (stergere(nod -> son[(*s - 'a')], s + 1)) //daca am sters in continuare
{
nod -> son[(*s - 'a')] = 0;
--(nod -> nrsons);
}
if (nod -> cnt == 0 && nod -> nrsons == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int query_aparitii(Trie * nod, char s[])
{
if (*s < 'a' || *s > 'z') //daca aici se termina cuvantul
return nod -> cnt;
if (nod -> son[(*s - 'a')])
return query_aparitii(nod -> son[(*s - 'a')], s + 1);
return 0;
}
int longest_prefix(Trie * nod, char s[], int k)
{
if ((*s < 'a' || *s > 'z') || nod -> son[(*s - 'a')] == 0)
return k;
return longest_prefix(nod -> son[(*s - 'a')], s + 1, k + 1);
}
int main()
{
char line[50];
while (f.getline(line, 35))
{
if (line[0] == '0')
insereaza(T, line + 2);
if (line[0] == '1')
stergere(T, line + 2);
if (line[0] == '2')
g << query_aparitii(T, line + 2) << "\n";
if (line[0] == '3')
g << longest_prefix(T, line + 2, 0) << "\n";
}
}