专栏文章

题解:AT_abc398_f [ABC398F] ABCBA

AT_abc398_f题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mipu5ci4
此快照首次捕获于
2025/12/03 17:59
3 个月前
此快照最后确认于
2025/12/03 17:59
3 个月前
查看原文

F - ABCBA

题目大意

KMP 板子。
给定一个只包含大写英文字母的字符串 SS,要求构造一个以 SS 为前缀的最短回文字符串。

解题思路

  • 将字符串 SS 反转得到 RR
  • 构造字符串 C = R + # + S
  • CC 上计算 KMPKMP 失配函数,得到末尾位置可匹配的最长前后缀长度 ll
ll 表示 SS 的开头与 RR 的结尾重合的最大部分,因此只需将 RR 剩下未匹配的前缀部分拼接到 SS 后,即为最短回文。
代码
CPP
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    string s;
    cin>>s;

    string r=s;
    reverse(r.begin(),r.end());

    string c=r+"#"+s;
    int n=c.size();
    vector<int> p(n,0);

    for(int i=1;i<n;i++){
        int j=p[i-1];
        while(j>0&&c[i]!=c[j]){
            j=p[j-1];
        }
        if(c[i]==c[j]){
            j++;            
        }
        p[i]=j;
    }

    int l=p.back();
    string a=r.substr(l);
    
    cout<<s+a;

    return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...