Pagini recente » Cod sursa (job #37739) | Cod sursa (job #2458403) | Cod sursa (job #2270828) | Cod sursa (job #681746) | Cod sursa (job #2085682)
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct node
{
int cnt,n;
node *fii[27];
void nod()
{
for(int i=0;i<27;i++)
fii[i]=NULL;
n=cnt=0;
}
};
string cuv;
int cer;
node *rad = new node();
void adauga(node *curent, int i)
{
if(i == cuv.size())
{
curent -> cnt++;
return;
}
if(curent -> fii[cuv[i]-'a'] == NULL)
{
curent->fii[cuv[i]-'a']=new node();
curent -> n++;
}
adauga(curent -> fii[cuv[i]-'a'],i+1);
}
int sterge(node *curent, int i)
{
if(i == cuv.size())
{
curent->cnt--;
}
else
{
if(sterge(curent->fii[cuv[i]-'a'],i+1))
{
curent->n--;
curent->fii[cuv[i]-'a'] = NULL;
}
}
if(curent != rad && curent->cnt == 0 && curent->n == 0)
{
delete curent;
return 1;
}
return 0;
}
int aparitii(node *curent, int i)
{
if(i==cuv.size())
return curent->cnt;
if(curent ->fii[cuv[i]-'a']==NULL)
return 0;
return aparitii(curent ->fii[cuv[i]-'a'],i+1);
}
int pref(node *curent, int i)
{
if(curent==NULL)
return i-1;
if(i == cuv.size())
return i;
return pref(curent->fii[cuv[i]-'a'],i+1);
}
int main()
{
while(in>>cer>>cuv)
{
if(cer==0)
adauga(rad,0);
if(cer==1)
sterge(rad,0);
if(cer==2)
out << aparitii(rad,0)<<'\n';
if(cer==3)
out << pref(rad,0)<<'\n';
}
return 0;
}