Pagini recente » Cod sursa (job #3221384) | Cod sursa (job #749524)
Cod sursa(job #749524)
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
typedef string::iterator siterator;
typedef string::const_iterator csiterator;
class Trie {
bool isRoot;
Trie *nods[30];
int countAp, countSet;
bool Del(csiterator it, csiterator iend)
{
if(it >= iend)
{
--countAp;
return 0 == countAp && 0 == countSet;
}
int indexC=*it-'a';
if(true == nods[indexC]->Del(it+1, iend))
{
--countSet;
delete nods[indexC];
nods[indexC]=NULL;
}
if(!isRoot && 0 == countAp && 0 == countSet)
return true;
return false;
}
public:
Trie() {
isRoot=true;
countAp=countSet=0;
for(int i=0; i < 30; ++i)
nods[i]=NULL;
}
void Add(csiterator it, csiterator iend)
{
if(it >= iend)
++countAp;
else {
int indexC=*it-'a';
if(NULL == nods[indexC])
nods[indexC]=new Trie(), ++countSet;
nods[indexC]->isRoot=false;
nods[indexC]->Add(it+1, iend);
}
}
void Delete(csiterator it, csiterator iend) {Del(it, iend);}
int CountAp(csiterator it, csiterator iend)
{
if(it >= iend)
return countAp;
else {
int indexC=*it-'a';
if(NULL == nods[indexC])
return 0;
return nods[indexC]->CountAp(it+1, iend);
}
}
int LCP(csiterator it, csiterator iend)
{
if(it >= iend)
return 1;
else {
int indexC=*it-'a';
if(NULL == nods[indexC])
return 0;
return 1+nods[indexC]->LCP(it+1, iend);
}
}
} root;
int main()
{
int op;
string s;
ifstream in("trie.in");
ofstream out("trie.out");
while(in>>op>>s)
{
switch(op)
{
case 0: root.Add(s.begin(), s.end()); break;
case 1: root.Delete(s.begin(), s.end()); break;
case 2: out<<root.CountAp(s.begin(), s.end())<<'\n'; break;
case 3: out<<root.LCP(s.begin(), s.end())<<'\n';
}
}
return EXIT_SUCCESS;
}