Pagini recente » Cod sursa (job #1773147) | Cod sursa (job #693428) | Cod sursa (job #1933736) | Cod sursa (job #1571792) | Cod sursa (job #1987069)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Node
{
int Nr,NrSons;
Node * Son[26];
Node()
{
Nr = NrSons = 0;
for(int i = 0; i < 26; ++i)
Son[i] = 0;
}
};
Node * Trie = new Node;
void Insert(Node * T, char p[25])
{
if(p[0] == 0)
{
T -> Nr ++;
return;
}
int Index = p[0] - 'a';
if(!T->Son[Index])
{
T -> Son[Index] = new Node;
T -> NrSons ++;
}
Insert(T -> Son[Index], p + 1);
}
int Delete(Node * T, char * p)
{
if(p[0] == 0)
{
T -> Nr --;
}
else
{
int Index = p[0] - 'a';
int Value = Delete(T -> Son[Index],p + 1);
if(Value == 1)
{
T -> Son[Index] = 0; T -> NrSons--;
}
}
if(T -> Nr == 0 && T -> NrSons == 0 && T != Trie)
{
delete T;
return 1;
}
return 0;
}
int Find(Node * T, char * p)
{
if(p[0] == 0)
return T -> Nr;
int Index = p[0] - 'a';
if(T -> Son[Index])
return Find(T -> Son[Index], p + 1);
return 0;
}
int Prefix(Node * T, char * p, int k)
{
if(p[0] == 0)
return k;
int Index = p[0] - 'a';
if(T -> Son[Index])
return Prefix(T -> Son[Index], p + 1, k + 1);
return k;
}
int main()
{
char Word[25];
while(fin.getline(Word,25))
{
if(Word[0] == '0')
Insert(Trie,Word + 2);
if(Word[0] == '1')
Delete(Trie, Word + 2);
if(Word[0] == '2')
fout << Find(Trie, Word + 2) << "\n";
if(Word[0] == '3')
fout << Prefix(Trie, Word + 2, 0) << "\n";
}
return 0;
}