FFT+manacher,稍微yy一下……
其实我就是码个模板上来2333
#include<bits/stdc++.h>
#define MAXN (1<<18)
#define MOD (long long)(1e9+7)
#define pi (acos(-1))
using namespace std; char s[MAXN];int ls;
long long cf[MAXN];
long long ans=0;
struct vec{
double r,i;
vec(double t=0,double tt=0):r(t),i(tt){}
vec operator + (const vec &x){
return vec(r+x.r,i+x.i);
}
vec operator * (const vec &x){
return vec(r*x.r - i*x.i , r*x.i + i*x.r);
}
vec operator - (const vec &x){
return vec(r-x.r,i-x.i);
}
vec sqr(){
return (*this)*(*this);
}
};
vec a[MAXN],b[MAXN];
int nn;
void fft(vec *a,int n,int opt){
for(int i=0,j=0;i<n;++i){
if(i<j) swap(a[i],a[j]);
for(int k=n>>1;(j^=k)<k;k>>=1);
}
for(int i=1;i<n;i<<=1){
vec wn(cos(pi/i),opt*sin(pi/i));
vec w;
for(int j=0,p=i<<1;j<n;j+=p){
w=vec(1,0);
for(int k=0;k<i;++k,w=w*wn){
vec u=a[j+k],v=w*a[j+k+i];
a[j+k]=u+v,a[j+k+i]=u-v;
}
}
}
if(!(~opt))
for(int i=0;i<n;++i) a[i].r/=n;
}
int f[MAXN<<1];
void manacher(){
for(int i=ls-1;~i;--i){
s[i+1<<1]=s[i];
s[i<<1|1]='#';
}
s[0]='@',s[ls<<1|1]='#';
int tl=ls+1<<1;
for(int i=1,id=0,R=0;i<tl;++i){
f[i]= i>=R ?1 : min(R-i,f[(id<<1)-i]);
while(s[i+f[i]]==s[i-f[i]]) ++f[i];
if(i+f[i]>R)
R=i+f[i], id=i;
}
}
int main(){
scanf("%s",s),ls=strlen(s);
cf[0]=1;
for(int i=1;i<ls;++i) cf[i]=(cf[i-1]<<1)%MOD;
for(int i=0;i<ls;++i)
a[i].r=s[i]=='a',b[i].r=s[i]=='b';
for(nn=1;nn<=(ls<<1);nn<<=1);
fft(a,nn,1),fft(b,nn,1);
for(int i=0;i<nn;++i) a[i]=a[i].sqr()+b[i].sqr();
fft(a,nn,-1);
for(int i=0;i<nn;++i)
ans+=cf[ (int)(a[i].r+0.5)+1 >>1]-1;
manacher();
for(int i=0;s[i];++i) ans-=(f[i]>>1);
printf("%lld\n",ans%MOD);
return 0;
}
/*
abaabaa
*/