P9606 ABB

点击查看代码
#include<bits/stdc++.h>

using namespace std;

const int N=8e5+10;
char str[N];
int ne[N];

int main()
{
    int n;
    string s;
    cin>>n>>s;
    //构造反转拼接字符串
    for(int i=0;i<n;i++){
        str[n+2+i]=s[i];
    }
    str[n+1]='%';
    for(int i=1,j=2*n+1;i<=n;i++,j--){
        str[i]=str[j];
    }
    
    //构造ne数组
    for(int i=2,j=0;i<=2*n+1;i++){
        while(j&&str[j+1]!=str[i]) j=ne[j];
        if(str[j+1]==str[i]) j++;
        ne[i]=j;
    }

    cout<<n-ne[2*n+1]<<endl;

    return 0;

}

基本上还是kmp模板,不过用到了一个技巧,求回文需要添加多少,可以用这种反转拼接的方式判断,本质是求最大回文后缀,去掉回文后缀就是不得不添加的字母了
posted @ 2025-11-30 23:26  AnoSky  阅读(6)  评论(0)    收藏  举报