Pagini recente » Cod sursa (job #588336) | Cod sursa (job #545789) | Cod sursa (job #74687) | Cod sursa (job #626507) | Cod sursa (job #754896)
Cod sursa(job #754896)
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
typedef string::const_iterator sit;
class Trie {
int countAp, countSet;
bool isRoot;
Trie *v[31];
bool Del(sit it, sit iend)
{
if(it >= iend)
{
--countAp;
if(0 == countAp && 0 == countSet)
return true;
return false;
}
int idx=*it - 'a';
if(NULL == v[idx])
throw "String given isn't in trie";
if(true == v[idx]->Del(it+1, iend))
{
delete v[idx];
v[idx]=NULL;
--countSet;
}
if(!isRoot && 0 == countSet + countAp)
return true;
return false;
}
public :
Trie() : countAp(0), countSet(0), isRoot(true)
{
for(int i=0; i < 31; ++i)
v[i]=NULL;
}
void Add(sit it, sit iend)
{
if(it >= iend)
++countAp;
else {
int idx=*it - 'a';
if(NULL == v[idx])
v[idx]=new Trie(), ++countSet;
v[idx]->isRoot=false;
v[idx]->Add(it+1, iend);
}
}
int CountAp(sit it, sit iend)
{
if(it >= iend)
return countAp;
int idx=*it - 'a';
if(NULL == v[idx])
return 0;
return v[idx]->CountAp(it+1, iend);
}
void Delete(sit it, sit iend) {Del(it, iend);}
int LCP(sit it, sit iend)
{
if(it >= iend)
return 1;
int idx=*it - 'a';
if(NULL == v[idx])
return 0;
return 1+v[idx]->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;
}