#include #include #include #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) long n; char str[500001]; long s[1000000]; long b[500000]; long start[32],ns[32]; long delta[32],nd[32]; long num[32],nn[32]; long pre[500000],suf[500000]; long ep[500000],dp[500000]; void manacher(void){ long i=0,j=0,k; while(i=0 && i+j+1=0 && s[i]-k>=0 && s[i-k]!=s[i]-k){ s[i+k]=min(s[i-k],s[i]-k); k++; } i+=k; j=max(j-k,0); } } int main(){ long i,I,g,g1,g2,g3,j,lv,r; long long ans=0; str[0]=getchar(); n=0; while(str[n]!='\n'){ n++; str[n]=getchar(); } manacher(); for(i=0;i=0 && str[start[j]-1]==str[i]){ //printf("cont s: %ld d: %ld n: %ld \n",start[j]-1,delta[j],num[j]); start[j]--; start[g1]=start[j]; delta[g1]=delta[j]; num[g1]=num[j]; g1++; } } memset(ns,0,sizeof(ns)); memset(nd,0,sizeof(nd)); memset(nn,0,sizeof(nn)); g2=0; for(j=0;j=0 && ns[g2-1]+nd[g2-1]*(nn[g2-1]-1)==start[j]-delta[j])){ ns[g2]=start[j]; nd[g2]=delta[j]; nn[g2]=num[j]; g2++; continue; } ns[g2]=start[j]; nd[g2]=(g2==0)?I:start[j]-(ns[g2-1]+nd[g2-1]*(nn[g2-1]-1)); nn[g2]=1; g2++; if(num[j]>1){ ns[g2]=start[j]+delta[j]; nd[g2]=delta[j]; nn[g2]=num[j]-1; g2++; } } if(i-1>=0 && str[i-1]==str[i]){ ns[g2]=i-1; nd[g2]=(0=0) lv+=pre[r-1]; if(num[j]>1 && start[j]-delta[j]>=0){ lv+=ep[start[j]-delta[j]]; } //printf("%ld\n",lv); dp[i]+=lv; if(delta[j]<=start[j]){ ep[start[j]-delta[j]]=lv; } } //printf("g %ld\n",g); } for(i=0;i