//暴力拿75,时间不够
using namespace std;
int get(string a, string b)
{
int ans=0;
int lenA=a.size();
int lenB=b.size();
for(int i=0;i<lenA;i++){
for(int j=0;j<lenB;j++){
if(a[i]==b[j]){
int k=1;
while(a[i+k]==b[j+k] && i+k<lenA && j+k<lenB) k++;
ans = max(ans,k);
}
}
}
return ans;
}
int main()
{
string a,b;
cin>>a>>b;
int ans=get(a, b);
cout<<ans;
return 0;
}
```
//dp 拿88,空间不够
#include <bits/stdc++.h>
#define N 50130
using namespace std;
int dp[10000][10000]={0};
int get(string a, string b){
int len1 = a.size();
int len2 = b.size();
int max = 0;
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
if (a[i] == b[j]) {
if (i == 0|| j == 0) {
dp[i][j] = 1;
}
else {
dp[i][j] = dp[i-1][j-1] + 1;
}
}
else {
dp[i][j] = 0;
}
if (max < dp[i][j]) {
max = dp[i][j];
}
}
}
return max;
}
int main()
{
string a,b;
cin>>a>>b;
int ans=get(a,b);
cout<<ans<<endl;
return 0;
}
//dp+滚动数组+从后往前遍历防止数据被覆盖 AC
#include <bits/stdc++.h>
#define N 50130
using namespace std;
int dp[N]={0};
int get(string a, string b){
int len1 = a.size();
int len2 = b.size();
int ans=0;
for(int i=0;i<len1;i++){
for(int j=len2-1;j>=0;j--){
if(a[i]==b[j]){
if(j==0) dp[0] = 1;
dp[j] = dp[j-1]+1;
}
else dp[j]=0;
ans = max(dp[j],ans);
}
}
return ans;
}
int main()
{
string a,b;
cin>>a>>b;
int ans=get(a,b);
cout<<ans<<endl;
return 0;
}