Pagini recente » Cod sursa (job #1712783) | Cod sursa (job #2507109) | Cod sursa (job #1822460) | Cod sursa (job #2283832) | Cod sursa (job #1024023)
#include <iostream>
#include <fstream>
#include <cstring>
#define ch (*s - 'a')
#define operation (*word - '0')
using namespace std;
struct Trie
{
int nrfii, nrcuv;
Trie *fiu[26];
Trie()
{
nrfii = nrcuv = 0;
for (int i = 0; i<26; ++i)
fiu[i] = NULL;
}
};
Trie *T = new Trie;
inline void Add(Trie *nod, const char *s)
{
if (*s == 0)
{
nod->nrcuv++;
return;
}
if (nod->fiu[ch] == 0)
{
nod->fiu[ch] = new Trie;
nod->nrfii++;
}
Add(nod->fiu[ch], s+1);
}
inline bool Delete(Trie *nod, const char *s)
{
if (*s == 0)
{
nod->nrcuv--;
}
else
if (Delete(nod->fiu[ch], s+1))
{
nod->nrfii--;
nod->fiu[ch] = 0;
}
if (nod->nrfii == 0 && nod->nrcuv == 0 && nod!=T)
{
delete nod;
return true;
}
return false;
// if (*s == 0)
// {
// nod->nrcuv--;
// if (nod->nrcuv == 0 && nod->nrfii == 0 && nod != T)
// {
// delete nod;
// return true;
// }
// return false;
// }
// if (Delete(nod->fiu[ch], s+1))
// {
// nod->nrfii--;
// if (nod->nrfii == 0 && nod->nrcuv == 0 && nod!=T)
// {
// delete nod;
// return true;
// }
// }
// return false;
}
inline int Aparitii(const Trie *nod, const char *s)
{
if (*s == 0)
return nod->nrcuv;
if (nod->fiu[ch])
return Aparitii(nod->fiu[ch], s+1);
return 0;
}
inline int Prefix(const Trie *nod, const char *s)
{
if (*s == 0 || nod->fiu[ch] == 0)
return 0;
return 1 + Prefix(nod->fiu[ch], s+1);
}
int main()
{
char word[30];
ifstream f ("trie.in");
ofstream g ("trie.out");
while (f.getline(word, 30))
{
switch (operation)
{
case 0:
Add(T, word+2);
break;
case 1:
Delete(T, word+2);
break;
case 2:
g<<Aparitii(T, word+2)<<"\n";
break;
case 3:
g<<Prefix(T, word+2)<<"\n";
break;
}
}
f.close();
g.close();
return 0;
}