Pagini recente » Cod sursa (job #270445) | Cod sursa (job #1343804) | Cod sursa (job #3288856) | Cod sursa (job #3125854) | Cod sursa (job #2327210)
#include <fstream>
#include <cstring>
#define c (*S - 'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int ap, nrs;
Trie * Son[26];
Trie(){
ap = 0, nrs = 0;
for(int i = 0; i < 26; i++)
Son[i] = 0;
}
};
Trie * Root = new Trie;
bool Delete(Trie * & Nod, char S[])
{
if(*S) {
if(Delete(Nod->Son[c], S + 1))
Nod->nrs--, Nod->Son[c] = 0;
}
else Nod->ap--;
if(Nod->ap == 0 && Nod->nrs == 0 && Nod != Root)
{
delete Nod;
return 1;
}
return 0;
}
void Insert(Trie * & Nod, char S[])
{
if(*S) {
if(Nod->Son[c] == 0)
{
Nod->Son[c] = new Trie;
Nod->nrs++;
}
Insert(Nod->Son[c], S + 1);
}
else Nod->ap++;
}
int Aparitii(Trie * Nod, char S[])
{
if(*S == 0) return Nod->ap;
if(Nod->Son[c] == 0)
return 0;
return Aparitii(Nod->Son[c], S + 1);
}
int Prefix(Trie * Nod, char S[], int lev)
{
if(*S == '\0')
return lev;
if(Nod->Son[c] == 0)
return lev;
return Prefix(Nod->Son[c], S + 1, lev + 1);
}
int main()
{
int p; char W[21];
while(fin >> p >> W) {
if(p == 0)
Insert(Root, W);
else if(p == 1)
Delete(Root, W);
else if(p == 2)
fout << Aparitii(Root, W) << '\n';
else
fout << Prefix(Root, W, 0) << '\n';
}
fin.close();
fout.close();
return 0;
}