传送门biu~
manacher模板题。修改一下判断条件即可,时间复杂度
O(n)
O
(
n
)
。
#include<bits/stdc++.h>
using namespace std;
int n,m,p[1000005];long long ans;
char s[500005],a[1000005];
inline void manacher(){
m=2*n+1;
for(int i=1;i<=n;++i) a[i<<1]=s[i],a[i<<1|1]='#';
a[0]='+';a[1]='#';a[m+1]='-';
int Max=0,mid=0;
for(int i=1;i<=m;i+=2){
if(Max>=i) p[i]=min(p[2*mid-i],Max-i);
while(a[i+p[i]+1]-'0'+a[i-p[i]-1]-'0'==1 || a[i+p[i]+1]=='#' && a[i-p[i]-1]=='#') ++p[i];
if(i+p[i]>Max) Max=p[i],mid=i;
}
}
int main(){
scanf("%d%s",&n,s+1);
manacher();
for(int i=1;i<=m;i+=2) ans+=p[i]>>1;
printf("%lld\n",ans);
return 0;
}
本文介绍了一个基于Manacher算法的模板实现,通过简单的条件修改达到O(n)的时间复杂度。该算法用于解决字符串中心对称问题,核心部分展示了如何计算每个字符的对称长度,并最终求得所有可能的回文子串数。
892

被折叠的 条评论
为什么被折叠?



