Pagini recente » Cod sursa (job #2894844) | Cod sursa (job #177084) | Cod sursa (job #3238519) | Cod sursa (job #1452848) | Cod sursa (job #3177314)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define p_Int (*p - 'a')
struct Trie{
int word, fii;
vector<Trie*> fiu;
Trie() {
word = fii = 0;
fiu = vector<Trie*> (26, 0);
}
};
Trie *Root = new Trie;
void insert(Trie *Nod, char *p)
{
if (*p == '\0')
{
Nod->word++;
return;
}
if (Nod->fiu[p_Int] == 0)
{
Nod->fiu[p_Int] = new Trie;
Nod->fii++;
}
insert(Nod->fiu[p_Int], p + 1);
}
int delete_word(Trie *Nod, char *p)
{
if (*p == '\0')
Nod->word--;
else
if ( delete_word(Nod->fiu[p_Int], p + 1) )
{
Nod->fiu[p_Int] = 0;
Nod->fii--;
}
if ( Nod->word == 0 && Nod->fii == 0 && Nod != Root)
{ delete Nod; return 1; }
return 0;
}
int word_que(Trie *Nod, char *p)
{
if (*p == '\0')
return Nod->word;
if (Nod->fiu[p_Int] != 0)
return word_que(Nod->fiu[p_Int], p + 1);
return 0;
}
int longest_pre(Trie *Nod, char *p, int k)
{
if (*p == '\0' || Nod->fiu[p_Int] == 0)
return k;
return longest_pre(Nod->fiu[p_Int], p + 1, k + 1);
}
int main()
{
int type;
while (in>> type)
{
string w; in>> w;
switch(type)
{
case 0: { insert(Root, &w[0]); break;}
case 1: { delete_word(Root, &w[0]); break;}
case 2: { out<< word_que(Root, &w[0]) << "\n"; break;}
case 3: { out<< longest_pre(Root, &w[0], 0) << "\n"; break;}
}
}
return 0;
}