Pagini recente » Cod sursa (job #3036937) | Cod sursa (job #2047421) | Cod sursa (job #2801385) | Cod sursa (job #2284763) | Cod sursa (job #2077965)
#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 * T = new Trie;
void Insert(Trie * p, char Word[])
{
if(Word[0] == 0)
{
p->Nr++;
return;
}
if(p->Son[Word[0]-'a'] == 0)
{
p->Son[Word[0]-'a'] = new Trie;
p->NrSons++;
}
Insert(p->Son[Word[0]-'a'], Word + 1);
}
int Find(Trie * p, char Word[])
{
if(Word[0] == 0)
return p->Nr;
if(p->Son[Word[0]-'a'] != 0)
return Find(p->Son[Word[0]-'a'], Word + 1);
return 0;
}
int Prefix(Trie * p, char Word[], int k)
{
if(Word[0] == 0)
return k;
if(p->Son[Word[0]-'a'] == 0)
return k;
return Prefix(p->Son[Word[0]-'a'], Word + 1,k + 1);
}
int Delete(Trie * p, char Word[])
{
if(Word[0] == 0)
p->Nr--;
else
if( Delete(p->Son[Word[0]-'a'], Word + 1) == 1)
{
p->Son[Word[0]-'a'] = 0;
p->NrSons--;
}
if(p -> Nr == 0 && p -> NrSons == 0 && p != T)
{
delete p;
return 1;
}
return 0;
}
int main()
{
char Line[30];
while(fin.getline(Line,30))
{
switch (Line[0])
{
case '0':
{
Insert(T,Line + 2);
break;
}
case '1':
{
Delete(T,Line + 2);
break;
}
case '2':
{
fout << Find(T,Line + 2)<< "\n";
break;
}
case '3':
{
fout << Prefix(T,Line + 2, 0) << "\n";
break;
}
}
}
return 0;
}