Pagini recente » Rating Onutu Codrin Stefan (StefanOnu) | Cod sursa (job #2955648) | Cod sursa (job #2235652) | Cod sursa (job #2801829) | Cod sursa (job #2466498)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nd{int ap;nd*n[27];}*R=new nd;
char a[22];
int v=1,n;
void adap(int i,nd*T)
{
if(i==n)
{
T->ap++;
}
else if(T->n[a[i]-'a']==NULL)
{
nd*K=new nd;
K->ap=0;T->n[a[i]-'a']=K;
for(int j=0;j<=26;++j)K->n[j]=NULL;
adap(i+1,T->n[a[i]-'a']);
}
else adap(i+1,T->n[a[i]-'a']);
}
int reap(int i,nd*T)
{
if(i==n)
{
T->ap--;
if(T->ap<=0)
{
for(int j=0;j<=26;++j)if(T->n[j]!=NULL)return 0;
if(T!=R)delete(T);return 1;
}
return 0;
}
else if(T->n[a[i]-'a']!=NULL)
{
int q=reap(i+1,T->n[a[i]-'a']);
if(q==0)return 0;
else
{
q=0;T->n[a[i]-'a']=NULL;
if(T->ap>0)return 0;
for(int j=0;j<=26;++j)if(T->n[j]!=NULL)return 0;
if(T!=R)delete(T);return 1;
}
}
else return 0;
}
void cap(int i,nd*T)
{
if(i==n)
{
g<<T->ap<<'\n';
}
else if(T->n[a[i]-'a']==NULL)
{
g<<0<<'\n';
}
else cap(i+1,T->n[a[i]-'a']);
}
int pap(int i,nd*T)
{
if(i==n)
{
return i;
}
else if(T->n[a[i]-'a']==NULL)
{
return i;
}
else return pap(i+1,T->n[a[i]-'a']);
}
int main()
{
for(int i=0;i<=25;++i)R->n[i]=NULL;
while(f>>v)
{
f>>a;n=strlen(a);
switch(v)
{
case 0:adap(0,R);break;
case 1:reap(0,R);break;
case 2:cap(0,R);break;
case 3:g<<pap(0,R)<<'\n';break;
}
}
}