Pagini recente » Cod sursa (job #44524) | Cod sursa (job #841832) | Cod sursa (job #1619822) | Cod sursa (job #1933796) | Cod sursa (job #1831931)
#include<fstream>
#include<iostream>
#include<cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int nr,sons;
Trie *son[26];
Trie()
{
nr = sons = 0;
memset(son,0,sizeof(son));
}
};
Trie *T = new Trie;
char Buff[25];
void Add(Trie *nod , char *X)
{
if(*X == '\0')
{
nod->nr++;
return;
}
char chr = *X - 'a';
if(nod->son[chr] == 0)
{
nod->son[chr] = new Trie;
nod->sons++;
}
Add(nod->son[chr],X+1);
}
bool Delete(Trie *nod , char *X)
{
char chr = *X - 'a';
if(*X == '\0') nod->nr--;
else
if(Delete(nod->son[chr],X+1))
{
nod->son[chr] = 0;
nod->sons--;
}
if(nod->nr == 0 && nod->sons == 0 && nod != T)
{
delete nod; return 1;
}
return 0;
}
int Search(Trie *nod , char *X)
{
if(*X == '\0') return nod->nr;
char chr = *X - 'a';
if(nod->son[chr])
return Search(nod->son[chr],X+1);
return 0;
}
int Prefix(Trie *nod , char *X , int k)
{
char chr = *X - 'a';
if(*X == '\0' || nod->son[chr] == 0)
return k;
return Prefix(nod->son[chr],X+1,k+1);
}
int main()
{
while(fin.getline(Buff,25))
{
char cod = Buff[0];
switch(cod)
{
case '0' : Add(T,Buff + 2); break;
case '1' : Delete(T,Buff + 2); break;
case '2' : fout<<Search(T,Buff + 2)<<"\n"; break;
case '3' : fout<<Prefix(T,Buff + 2,0)<<"\n"; break;
}
}
fin.close();
fout.close();
return 0;
}