分析

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

代码

#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;
}