专栏文章
题解: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 板子。
给定一个只包含大写英文字母的字符串 ,要求构造一个以 为前缀的最短回文字符串。
解题思路
- 将字符串 反转得到 。
- 构造字符串
C = R + # + S。 - 在 上计算 失配函数,得到末尾位置可匹配的最长前后缀长度 。
表示 的开头与 的结尾重合的最大部分,因此只需将 剩下未匹配的前缀部分拼接到 后,即为最短回文。
代码:
CPPint 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 条评论,欢迎与作者交流。
正在加载评论...