# 2022.6.2
# 关于最后一题的题解报告
# 首先关于求最长公共字串的题目,我们通常使用动态规划的方法来解决
# 什么叫做动态规划:其实就和高中里的数学归纳法比较相近,就是从 n-1 的情况推到 n 的情况
# 现在我们从题目出发,题目给了两个字符串 a 和 b ,要求两个字符串的最长公共字串
# 因此我们要维护一些东西
# 我们维护一个二维数组 f[i][j] ,那f[i][j] 表示的是什么意思呢?
# f[i][j] 表示的是对于a字符串中以第i个字符结尾的,b字符串中以第j个字符结尾的最长公共字串的长度
# 下面我们就考虑状态转移:
# 对于一个 i j 有两种情况:
# 1、 a[i] != b[j] 那么明显会有f[i][j]=0
# 2、 a[i] == b[j] 那么 f[i][j]=f[i-1][j-1]+1 就可以从第i-1个和第j-1个递推过来
# 那么我们就可以开始手撕题目了
a=input()
b=input()
f=[[0 for j in range(len(b))] for i in range(len(a))] # 构造二维数组f
for i in range(len(a)):
for j in range(len(b)):
if a[i]!=b[j]:
f[i][j]=0
else:
f[i][j]=f[i-1][j-1]+1
# 维护了f[i][j] 我们就要去找最长的长度了
len_max=0
daan=""
for i in range(len(a)):
for j in range(len(b)):
if f[i][j]>len_max:
daan=""
len_max=f[i][j]
for k in range(i-len_max+1,i+1):
daan=daan+a[k]
print(daan)
# 2022.6.2
# 关于最后一题的题解报告
# 首先关于求最长公共字串的题目,我们通常使用动态规划的方法来解决
# 什么叫做动态规划:其实就和高中里的数学归纳法比较相近,就是从 n-1 的情况推到 n 的情况
# 现在我们从题目出发,题目给了两个字符串 a 和 b ,要求两个字符串的最长公共字串
# 因此我们要维护一些东西
# 我们维护一个二维数组 f[i][j] ,那f[i][j] 表示的是什么意思呢?
# f[i][j] 表示的是对于a字符串中以第i个字符结尾的,b字符串中以第j个字符结尾的最长公共字串的长度
# 下面我们就考虑状态转移:
# 对于一个 i j 有两种情况:
# 1、 a[i] != b[j] 那么明显会有f[i][j]=0
# 2、 a[i] == b[j] 那么 f[i][j]=f[i-1][j-1]+1 就可以从第i-1个和第j-1个递推过来
# 那么我们就可以开始手撕题目了