模板—字符串—回文自动机
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 500010
int nxt[N][26],tot=1,fa[N]={1,1},last,n;
long long size[N],len[N]={0,-1}; char str[N];
void insert(int x,int now)
{
int p=last;
while(str[now-len[p]-1]!=str[now]) p=fa[p];
if(!nxt[p][x])
{
int q=fa[p]; while(str[now-len[q]-1]!=str[now]) q=fa[q];
fa[++tot]=nxt[q][x],nxt[p][x]=tot,len[tot]=len[p]+2;
} last=nxt[p][x],size[last]++;
}
int main()
{
scanf("%s",str+1),n=strlen(str+1);
for(int i=1;i<=n;i++) insert(str[i]-'a',i);
for(int i=tot;i>1;i--) size[fa[i]]+=size[i];
}