/*
TASK:balls
LANG:C++
*/

#include<stdio.h>
#define max(a,b) (a>b?a:b)
#define recc(a,b) (memo[a][b]==0?rec(a,b):memo[a][b]-1)
//FILE *f=fopen("balls.in","rt");

int masiv[1000],a,x,topki[1000],n,cvqt[7][1000],index[7],index2[7],memo[1000][1000],m;
char tmp;

void input()
{
//fscanf(f,"%c",&tmp);
scanf("%c",&tmp);
while(tmp!='\n')
{
switch(tmp)
{
case 'r': a=1;break;
case 'b': a=2;break;
case 'g': a=3;break;
case 'w': a=4;break;
case 'p': a=5;break;
case 'y': a=6;break;
}
masiv[x]=a;
x++;
//fscanf(f,"%c",&tmp);
scanf("%c",&tmp);
}
m=x;
x=0;
//fscanf(f,"%c",&tmp);
scanf("%c",&tmp);
while(tmp!='\n')
{
switch(tmp)
{
case 'r': a=1;break;
case 'b': a=2;break;
case 'g': a=3;break;
case 'w': a=4;break;
case 'p': a=5;break;
case 'y': a=6;break;
}
topki[x]=a;
x++;
//fscanf(f,"%c",&tmp);
scanf("%c",&tmp);
}
n=x;
for(x=0;x<n;x++)
cvqt[topki[x]][index[topki[x]]++]=x;
return;
}


int rec(int place,int level)
{
int b=0;
if(level==n||place==m)
{
memo[place][level]=1;
return memo[place][level]-1;
}

if(index2[masiv[place]]==index[masiv[place]])
{
memo[place][level]=recc(place+1,level)+1;
return memo[place][level]-1;
}

while(cvqt[masiv[place]][index2[masiv[place]]+b]<level&&index2[masiv[place]]+b<index[masiv[place]])
b++;
if(index2[masiv[place]]+b!=index[masiv[place]])
{
index2[masiv[place]]+=b;
memo[place][level]=recc(place+1,cvqt[masiv[place]][index2[masiv[place]]]+1);
memo[place][level]++;
index2[masiv[place]]-=b;
}
b=recc(place+1,level);
if(b>memo[place][level])
memo[place][level]=b;

memo[place][level]++;

//memo[place][level]=max(memo[place][level],b)+1;
return memo[place][level]-1;
}


int main()
{
input();
memo[0][0]=recc(0,0);
/*
fclose(f);
f=fopen("balls.out","wt");
fprintf(f,"%d\n",memo[0][0]);
*/
printf("%d\n",memo[0][0]);
return 0;
}













