2020牛客国庆集训派对day1 A

ABB

https://ac.nowcoder.com/acm/contest/7817/A

分析

我们需要加几个字符在末尾将其变为回文串。那么我们可以很容易考虑到,回文中心一定在这个字符串上。那么当一个回文中心确定时,这个串其实也就确定了。那么添加的长度为 。所以我们就应该寻找最大的可行的 。那么当一个字符可以为回文中心时当且仅当,回文中心加上回文半径覆盖了第 个字符的。那么求出每个点的回文半径就做完了。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 3e7 + 100;
char ch[N],S[N];
int n,cnt,p[N],ans;
int main() {
    scanf("%d%s",&n,ch+1);
    S[0] = '~';S[cnt = 1] = '|';
    for(int i = 1;i <= n;i++) {
        S[++cnt] = ch[i];S[++cnt] = '|';
    }
    for(int i = 1,mid = 0,r = 0;i <= cnt;i++) {
        if(i <= r) p[i] = min(p[mid*2-i],r-i+1);
        while(S[i - p[i]] == S[i + p[i]]) ++p[i];
        if(p[i] + i > r) r = p[i] + i - 1,mid = i;
        if(i + p[i] - 1 == cnt) ans = max(ans,p[i]);
    }
    printf("%d\n",n - ans + 1);
    return 0;
}
比赛题解 文章被收录于专栏

近期比赛的题解应该有吧。。。

全部评论

相关推荐

03-12 09:57
软件测试
程序员小白条:1)确定测试,测开的方向,技术栈不能写这么少 2)课程凑数的,不是99,100分没必要写 3)实习经历这块要有突出的不是劳动性质的亮点,自己设计的什么方案,什么自动化?什么提效工具?不是一些边角料,人云亦云的东西,没吸引力 4) 校园经历纯没用 5)尽量少写减分项
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

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