Pagini recente » Cod sursa (job #2885065) | Cod sursa (job #3256615) | Cod sursa (job #1086538) | Cod sursa (job #2315908) | Cod sursa (job #3276921)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int Nr,NrSons;
Trie* Son[26];
Trie()
{
Nr = NrSons = 0;
for(int i = 0; i < 26; ++i)
Son[i] = NULL;
}
};
Trie * Root = new Trie;
int Print(Trie * Nod, char String[])
{
if( !(*String) )
return Nod -> Nr;
if(! (Nod->Son[*String - 'a']))
return 0;
return Print(Nod->Son[*String - 'a'], String + 1);
}
int Prefix(Trie * Nod, char String[], int k)
{
if( !(*String) )
return k;
if(! (Nod->Son[*String - 'a']))
return k;
return Prefix(Nod->Son[*String - 'a'], String + 1,k + 1);
}
void Insert(Trie * Nod, char String[])
{
if( !(*String) )
{
Nod -> Nr++ ;
}
else
{
if(! (Nod->Son[*String - 'a']))
{
Nod->Son[*String - 'a'] = new Trie;
Nod->NrSons++;
}
Insert(Nod->Son[*String - 'a'], String + 1);
}
}
int Delete(Trie * Nod, char String[])
{
if( !(*String) )
Nod -> Nr-- ;
else
{
if(Delete(Nod->Son[*String - 'a'], String + 1) == 1)
{
Nod->NrSons --;
Nod->Son[*String - 'a'] = NULL;
}
}
if(Nod->Nr == 0 && Nod->NrSons == 0 && Nod != Root)
{
delete Nod;
return 1;
}
else
{
return 0;
}
}
int main()
{
char Line[25];
while(fin.getline(Line,25))
{
if(Line[0] == '0')
Insert(Root, Line + 2);
if(Line[0] == '1')
Delete(Root, Line + 2);
if(Line[0] == '2')
fout << Print(Root , Line + 2) << "\n";
if(Line[0] == '3')
fout << Prefix(Root , Line + 2, 0) << "\n";
}
return 0;
}