最长双回文串
最长双回文串
题目描述
顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。
对于的数据, 。
对于的数据,。
对于的数据,。
对于的数据,。
对于的数据,。
Solution
先manache求出每个位置为中心的最长回文串,把中心的位置打在左端点上。
从左到右取一边Max,求出每一个位置x覆盖它的最右位置p[x]。
接着访问每一个中心x,取他的右端点xr,则ans= max(ans,p[xr]-x);相当于拼起来
我的做法是非正解。。没过的同学可以看看别人的。
我们oj数据弱可以过,洛谷过不了。
有没有神犇看看为啥错?或者出数据卡卡。
博主不胜感激。

1 #include<cstdio> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 #define maxn 1000000 8 using namespace std; 9 int n,p[maxn],Max[maxn]; 10 char ch[maxn],s[maxn]; 11 int main() 12 { 13 scanf(" %s",ch+1);n=strlen(ch+1); 14 for(int i=1;i<=n;i++){ 15 s[i+i]=ch[i];s[i+i+1]='%'; 16 } 17 int mr=0,id=0;s[0]='%';s[1]='%';s[n+n+2]='\n';n=n+n+1; 18 for(int i=1;i<=n;i++){ 19 p[i]=mr>i?min(p[2*id-i],mr-i):1; 20 while(s[i+p[i]]==s[i-p[i]])p[i]++; 21 if(i+p[i]>mr){ 22 mr=i+p[i]; 23 id=i; 24 25 } 26 Max[i-p[i]]=max(Max[i-p[i]],id); 27 //cout<<i<<' '<<p[i]<<endl; 28 } 29 for(int i=1;i<=n;i++)Max[i]=max(Max[i],Max[i-1]); 30 int ans=0; 31 for(int i=1;i<=n;i++){ 32 ans=max(ans,Max[i+p[i]-1]-i); 33 } 34 cout<<ans<<endl; 35 return 0; 36 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构