模板:
#include<bits/stdc++.h> using namespace std; int const N=1e5+5; char s[N*2],t[N]; int r[N*2]; int change() { int j=2,len=strlen(t); s[0]='$'; s[1]='#'; for(int i=0; i<len; i++) { s[j++]=t[i]; s[j++]='#'; } s[j++]='#'; return j; } int manacher() { memset(r,0,sizeof(r)); memset(s,0,sizeof(s)); int len=change(),maxn=1,mid=1,ans=-1,sum=0; for(int i=1; i<len; i++) { if(i<maxn)//i在maxn左边时 r[i]=min(maxn-i,r[mid*2-i]); else r[i]=1; while(s[i+r[i]]==s[i-r[i]]) r[i]++; if(maxn<i+r[i])//更新最大值 { mid=i;//中心为mid maxn=i+r[i];//最右边为maxn } ans=max(ans,r[i]-1);//最长回文子串长度 sum+=r[i]/2;//回文子串的个数 } return sum;//要啥返回啥 } int main() { while(scanf("%s",t)!=EOF) { printf("%d ",manacher()); } }