Pagini recente » Cod sursa (job #2156594) | Cod sursa (job #170229) | Cod sursa (job #374419) | Cod sursa (job #1005504) | Cod sursa (job #670271)
Cod sursa(job #670271)
#include<fstream>
using namespace std;
int i,j,n=0,m=0;
char a[110];
struct trie
{
char c;
int fi,fr,cuv,ap;
};
trie v[600010];
void adauga()
{
int k=0,rad=0,i,j;
for(i=2;a[i]&&a[i]!='\n';++i)
{
for(j=v[rad].fi;j;j=v[j].fr)
if(v[j].c==a[i])
{
++v[j].ap;
if(!a[i+1]||a[i+1]=='\n')
++v[j].cuv;
rad=j;
break;
}
else
k=j;
if(!j)
{
++n;
v[n].c=a[i];
v[n].ap=1;
if(!a[i+1]||a[i+1]=='\n')
v[n].cuv=1;
else
v[n].cuv=0;
if(!v[rad].fi)
v[rad].fi=n;
else
v[k].fr=n;
rad=n;
}
}
}
void sterge()
{
int i,j,rad=0;
for(i=2;a[i]&&a[i]!='\n';++i)
for(j=v[rad].fi;j;j=v[j].fr)
if(a[i]==v[j].c)
{
--v[j].ap;
if(!a[i+1]||a[i+1]=='\n')
--v[j].cuv;
rad=j;
break;
}
}
int cauta()
{
int i,j,rad=0;
for(i=2;a[i]&&a[i]!='\n';++i)
{
for(j=v[rad].fi;j;j=v[j].fr)
if(a[i]==v[j].c&&v[j].ap)
{
rad=j;
if(!a[i+1]||a[i+1]=='\n')
return v[rad].cuv;
break;
}
if(!j)
return 0;
}
return 0;
}
int prefix()
{
int rad=0,i,j,nr=0;
for(i=2;a[i]&&a[i]!='\n';++i)
{
for(j=v[rad].fi;j;j=v[j].fr)
if(a[i]==v[j].c&&v[j].ap)
{
++nr,rad=j;
break;
}
if(!j)
return nr;
}
return nr;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(fgets(a,101,stdin))
{
if(a[0]=='0')
adauga();
if(a[0]=='1')
sterge();
if(a[0]=='2')
printf("%d\n",cauta());
if(a[0]=='3')
printf("%d\n",prefix());
}
return 0;
}