El significado de los problemas
Varios definición diferente de una cadena de caracteres de la cadena de valor, una cadena de todos los valores subcadenas palindrómicas que buscan.
solución del problema
Palíndromo bordo autómata examinó la cuestión, pero por desgracia el tiempo no lo hizo antes de la escuela, construida árbol directamente palíndromo, el DFS estadísticas sobre la línea.
Con el fin de escribir esto es casi perfecto palíndromo plantilla de máquina automática, plantillas antes de escribir que no funciona bien.
código
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
const int N=3e5+10;
char s[N];
int n;
LL ans;
struct PAM{
int tr[N][26],fail[N],len[N],cnt[N],tot,last,n;
int getfail(int x){
while(s[n]!=s[n-len[x]-1]) x=fail[x];
return x;
}
void init(char *s){
n=tot=last=0;
cnt[0]=len[0]=cnt[1]=0;
memset(tr[0],0,sizeof(tr[0]));
memset(tr[1],0,sizeof(tr[1]));
fail[0]=1;
len[++tot]=-1;
for(n=1;s[n]!='\0';n++){
int c=s[n]-'a',cur=getfail(last);
if(!tr[cur][c]){
len[++tot]=len[cur]+2;cnt[tot]=0;
memset(tr[tot],0,sizeof(tr[tot]));
fail[tot]=tr[getfail(fail[cur])][c];
tr[cur][c]=tot;
}
last=tr[cur][c];
cnt[last]++;
}
for(int i=tot;i>=0;i--) cnt[fail[i]]+=cnt[i];
}
int count,vis[26];
void dfs(int u){
ans+=count*cnt[u];
for(int i=0;i<26;i++){
if(!tr[u][i]) continue;
vis[i]++;if(vis[i]==1) count++;
dfs(tr[u][i]);
vis[i]--;if(!vis[i]) count--;
}
}
}pam;
int main(){
scanf("%s",s+1);
pam.init(s);
pam.dfs(0);
pam.dfs(1);
cout<<ans<<endl;
return 0;
}