C++课后习题训练记录Day175

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)练习心得:

注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法是否切换为英语模式;语法是否错误。

相关推荐
啦啦啦啦啦zzzz2 小时前
工具:动态类工厂和用配置文件存储属性
c++·设计模式·工具·动态工厂
脱胎换骨-军哥2 小时前
C++ 代码规范与格式化指南
开发语言·c++·代码规范
枕星而眠2 小时前
C++ STL Map容器完全指南:从有序红黑树到无序哈希表
java·开发语言
爱吃牛肉的大老虎3 小时前
Rust对象之结构体,枚举,特性
开发语言·后端·rust
bbq粉刷匠3 小时前
HashMap 底层原理深度拆解(二):putVal 完整链路解析(懒加载 · 链表遍历 · 尾插法)
java·开发语言·哈希算法
迷途之人不知返4 小时前
lambda表达式
c++
@三十一Y4 小时前
C++:红黑树的实现
开发语言·c++
_wyt0014 小时前
拓扑排序:有向无环图的排队艺术
c++·拓扑排序·队列
皓月斯语4 小时前
B2118 验证子串
c++·题解