链接:https://ac.nowcoder.com/acm/problem/23061
来源:牛客网

给定两个等长的由小写字母构成的串 ,其中

现在你需要求出一个子区间 使得  最大,并输出这个值。
表示S和T的最长公共前缀,表示S和T的最长公共后缀。

aaabbbcccddd
aaaddddddddd
15

选择  是一种可行的最优解。

思路

任何一个公共前缀本身就是一个公共后缀, 同样, 一个公共后缀也是公共前缀。 猜测:字符串的最长公共长度即是LCS和LCP的值。

证明: 设A是公共长度区间集合, B是满足题意的区间集合 显而易见, B可以左边为公共前缀, 右边为公共后缀, A只是其中一个。 但对于这两个公共前后缀来说 如果长度相等, 答案等同于任何一个。 如果长度不相等, 答案等同于其中最长的一个。

A==B, 证毕。

代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    string a,b;
    cin >> a >> b;
    int res= 0,ans = 0;
    for(int i = 0; i < a.size(); i++)
    {
        if(a[i] == b[i]) res++;
        else res = 0;
        ans = max(ans ,res);
    }
    cout << (long long)(ans + 1) * (ans + 1) - 1 << endl;
    return 0;
}