#include <iostream>
#include <vector>
#include <string>
using namespace std;
/*
解题思路:相当于将单序列回文串变成双序列相同公共子串问题,子串不是子序列
与合唱队问题区分开,子串必须连续,子序列可以不连续
状态转移方程一样的思路:
dp[i][j]表示串1的前i位与串2的前j位是否相同
s[i-1] == s[j-1] 则dp[i][j] = dp[i-1][j-1] + 1;
s[i-1] != s[j-1] 则dp[i][j] = 0
最大公共子串长度每次比较一次,从每次比较结果中选出最长公共子串
(不同于子序列不连续时dp[i][j]不会为0,最后输出dp[m][n]即为最长子序列)
*/
int main() {
string s1,s2;
while(cin >> s1 >> s2){
int m = s1.length();
int n = s2.length();
int maxlen = 0;
vector<vector<int> > dp(m+1,vector<int>(n+1,0));
for(int i = 1; i <=m ; i++){
for(int j = 1 ; j <= n; j++){
if(s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = 0;
maxlen = max(maxlen,dp[i][j]);
}
}
cout << maxlen << endl;
}
}
// 64 位输出请用 printf("%lld")