program P1050;
var
bs,cs:ansistring;
f:array [0..2000,0..2000] of longint;//f[i,j]表示在bs串中前i个,cs串前j个的最长公共长度
procedure init;
var
ch:char;
begin
fillchar(f,sizeof(f),0);
bs:=';
cs:=';
read(ch);
bs:=bs+ch;
while ch<>' ' do
begin
read(ch);
bs:=bs+ch;
end;
delete(bs,length(bs),1);
readln(cs);
end;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
procedure main;
var
i,j:longint;
begin
//通过一个双重循环求解,对于确定的i位同每一个j位进行配对
for i:=1 to length(bs) do
begin
for j:=1 to length(cs) do
begin
if bs[i]=cs[j] then f[i,j]:=f[i-1,j-1]+1//如果bs的第i位与cs的第j位相同,则说明它们是由i-1位,j-1位转移而来的并加上1(因为出现一个公共序列)
else if bs[i]<>cs[j] then f[i,j]:=max(f[i-1,j],f[i,j-1]);//否则就保持其中一个位置不动,寻找i的前一位或j的前一位并取一个最大值
end;
end;
//对于每一个状态,都能保证是由前面某个最大值转移而来的
end;
begin
assign(input,'P1050.in'); reset(input);
assign(output,'P1050.out'); rewrite(output);
init;
main;
writeln(f[length(bs),length(cs)]);
close(input); close(output);
end.