马拉车(求最长回文字串长度)
核心: 同 扩宽KMP, 利用已知信息阴影来 进行更新.
思路:
- 利用已知的东西来跳过,从而优化时间复杂度
- 首先预处理 每一个字符2边加上'#',开头加上'$', 任意没有在字符串中出现过的,
- 2个关键因素 mid,和p[],半径和 目前最大的 R
- 如果i<r,那么久可以来优化时间复杂度, 更具对称性
- 然后在暴力判断

#include <bits/stdc++.h> using namespace std; #define ri register int #define M 41000007 int n,m; string bbb; string s; int p[M];int ans=0; void manacher() { s="$#"; for(ri i=0;i<bbb.length();i++) { s+=bbb[i]; s+="#"; } int r=0,mid=0; for(ri i=1;i<s.length();i++) { if(i<r) { p[i]=min(p[mid*2-i],r-i+1); } while(s[i-p[i]]==s[i+p[i]]) p[i]++; if(p[i]+i>r) r=p[i]+i-1,mid=i; ans=max(p[i],ans); } } int main(){ cin>>bbb; manacher(); cout<<ans-1; }
后记:
- 初始位置: (i-p[i])/2;
模板题: