1.练习项目 :
问题描述
给定一个字符串 S ,请找出 S 的一个前缀和后缀,使得它们拼接后是一个回文串。
请输出这个串的最长长度。
输入描述
输入一行包含一个字符串 S ,由小写英文字母组成。
输出描述
输出一行包含一个整数表示答案。
2.选择课程
在蓝桥云课中选择题库,选择题号17148并开始练习。
3.开始练习
(1)源码 :
#include <bits/stdc++.h>
using namespace std;
using ull=unsigned long long;
const int N=1e5+10,base=131;
ull preN,bN,sufN;
char sN;
int n,pN;
ull getpre(int l,int r)
{
return prer-prel-1*br-l+1;
}
ull getsuf(int l,int r)
{
return sufl-sufr+1*br-l+1;
}
bool check(int r)
{
ull a=getpre(1,r),b=getsuf(n-r+1,n);
return a==b;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>s+1;
n=strlen(s+1);
b0=1;
for(int i=1;i<=n;i++){
bi=bi-1*base;
prei=prei-1*base+si;
}
for(int i=n;i>=1;i--){
sufi=sufi+1*base+si;
}
for(int i=2*n+1;i>=1;i--){
si=(i&1)?'#':si\>\>1;
}
s0='^',s2\*n+2='$';
int C=0,R=0;
for(int i=1;i<=2*n+1;i++){
pi=i<R?min(R-i,p2\*C-i):1;
while(si+p\[i]==si-p\[i])pi++;
if(i+pi>R)C=i,R=i+pi;
}
int ans=0;
for(int i=1;i<=2*n+1;i++){
int len=pi-1;
int idx=(i&1)?i-1>>1:i>>1;
int l=(i&1)?idx-len/2:idx-(len+1)/2;
int r=(i&1)?idx+len/2+1:idx+(len+1)/2;
if(check(l))
ans=max(ans,2*l+len);
if(check(n-r+1))
ans=max(ans,2*(n-r+1)+len);
}
cout<<ans<<'\n';
return 0;
}
(2)检验结果
对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。
(3)练习心得:
注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法是否切换为英语模式;语法是否错误。