题解 | #最长回文子串#

最长回文子串

https://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int kr[N];
string pail(string s)
{
    string str(2 * s.size() + 1, ' ');
    for(int i = 2 * s.size(); i >= 0; i -= 2)
    {
        str[i] = '*';
        str[i - 1] = s[(i - 1) >> 1];
    }
    int mid = 0, R = 0, c = 0;
    for(int i = 0; i < str.size(); i ++)
    {
        if(i < R) kr[i] = min(kr[2 * mid - i], R - i + 1);
        while(i - kr[i] >= 0 && i + kr[i] < str.size() && str[i - kr[i]] == str[i + kr[i]]) kr[i] ++ ;
        if(i + kr[i] > R) R = kr[i] + i - 1, mid = i;
        if(kr[i] > kr[c]) c = i;
    }
    int r = kr[c] - 1;
    int rr = r >> 1;
    c = c / 2;
    return s.substr(c - rr, r);
}
int main() {
    string s;
    getline(cin, s);
    s = pail(s);
    cout << s.size() ;
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务