n,m = map(int,input().split())
s1 = input()
s2 = input()
# **dp[i][j]定义为s1前i个字符和s2前j个字符的最长公共子序列
# 在已知dp[x][y](x<i,y<i)的前提下如何得到dp[i][j]?
# if s1[i-1] == s2[j-1]:dp[i][j] = dp[i-1][j-1]+1
# **else:dp[i][j] = max(dp[i][j-1],dp[i-1][j])(呃,似懂非懂的)
dp = [[0]*(m+1) for _ in range(n+1)]
for i in range(1,n+1):
    for j in range(1,m+1):
        if s1[i-1] == s2[j-1]:
            dp[i][j] = dp[i-1][j-1]+1
        else:
            dp[i][j] = max(dp[i-1][j],dp[i][j-1])
print(dp[n][m])