求一个字符串的回文子串个数。
凡是这类问题,优先考虑麻辣烫。
我们可以发现,依据题意,任意两个对称轴不同的回文串,都是「本质不同」的。
并且,每个回文串,和它对称轴相同的所有子串都必然是回文串。
故而我们先用麻辣烫处理,然后统计一遍即可。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Max(_A,_B) ((_A)>(_B)?(_A):(_B))
#define Min(_A,_B) ((_A)<(_B)?(_A):(_B))
int n,f[200005];
char ch[100005],s[200005];
inline void manacher(){
int mx=0,nw;
for(int i=2;i<=n;++i){
if(i<mx){
f[i]=Min(f[(nw<<1)-i],f[nw]-(i-nw));
}else{
f[i]=1;
}
while(s[i+f[i]]==s[i-f[i]]){
++f[i];
}
if(i+f[i]>mx){
mx=i+f[i];
nw=i;
}
}
}
void init(){
cin>>(ch+1);
n=strlen(ch+1);
s[1]=s[2]='#';
for(int i=1;i<=n;++i){
s[(i<<1)+1]=ch[i];
s[(i<<1)+2]='#';
}
n=(n<<1)+2;
s[n+1]=0;
manacher();
int ans=0;
for(int i=1;i<=n;++i){
ans+=f[i]/2;
}
printf("%d\n",ans);
}
int main(){
init();
return 0;
}