Pagini recente » Cod sursa (job #1950700) | Cod sursa (job #429407) | Cod sursa (job #1706123) | Cod sursa (job #3287704) | Cod sursa (job #2376527)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int Sigma = 26;
char Line[30];
struct Trie
{
int Nr,NrSons;
Trie * Son[Sigma];
Trie()
{
Nr = NrSons = 0;
for(int i = 0; i < Sigma; ++i)
Son[i] = 0;
}
};
Trie * T = new Trie;
void Insert(char * p, Trie * Nod)
{
if(*p == 0)
{
Nod->Nr++;
return;
}
int Next = p[0] - 'a';
if(Nod -> Son[Next] == 0)
{
Nod -> Son[Next] = new Trie;
Nod -> NrSons++;
}
Insert(p + 1,Nod -> Son[Next]);
}
int Find(char * p, Trie * Nod)
{
if(*p == 0)
return Nod->Nr;
int Next = p[0] - 'a';
if(Nod->Son[Next])
return Find(p+1,Nod->Son[Next]);
else
return 0;
}
int Prefix(char * p, Trie * Nod, int k)
{
if(*p ==0)
return k;
int Next = p[0] - 'a';
if(Nod->Son[Next])
return Prefix(p+1,Nod->Son[Next],k+1);
else
return k;
}
int Delete(char * p , Trie * Nod)
{
if(*p == 0)
Nod->Nr--;
else
{
int Next = p[0] - 'a';
if(Delete(p + 1, Nod->Son[Next]) == 1)
{
Nod->Son[Next] = 0;
Nod->NrSons--;
}
}
if(Nod->Nr == 0 && Nod->NrSons == 0 && Nod != T)
{
delete Nod;
return 1;
}
else
return 0;
}
int main()
{
while(fin.getline(Line,30))
{
if(Line[0] == '0')
Insert(Line + 2, T);
if(Line[0] == '1')
Delete(Line + 2, T);
if(Line[0] == '2')
fout << Find(Line + 2, T) << "\n";
if(Line[0] == '3')
fout << Prefix(Line + 2, T, 0) << "\n";
}
return 0;
}