给了两条限制,但是第二条想想是没用的,直接manacher就可以减掉多余的部分了,所以要求满足第一条的方案

也不难,可以想到枚举每个中心点,计算两边有多少对距离中心相等的位置值也相等,假设有\(t\)个,那么以这个中心点为半径的就是\(2^t-1\),因为每个都可以选或不选,减去全都不选的情况

现在就要计算和每个中心点距离相等的位置对数了,显然两个位置\(a,b\)如果值相同,那么中心就是\((a+b)/2\)(如果是小数的话就是两个格子之间的)

所以就简单了,\(A(i)=[S[i]='a'],B(i)=[S[i]='b']\),这两个多项式分别平方一下,然后再算\(2^x-1\),所有这些之和就是满足第一条的方案了

#include<bits/stdc++.h>
#define il inline
#define vd void
#define mod 1000000007
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const double pi=acos(-1);
struct cp{
double real,imag;
cp(){}
cp(const double&r,const double&i){real=r,imag=i;}
il cp conj(){return(cp){real,-imag};}
il vd operator =(const double&b){real=b,imag=0;}
};
il cp operator +(const cp&a,const cp&b){return(cp){a.real+b.real,a.imag+b.imag};}
il cp operator -(const cp&a,const cp&b){return(cp){a.real-b.real,a.imag-b.imag};}
il cp operator *(const cp&a,const cp&b){return(cp){a.real*b.real-a.imag*b.imag,a.real*b.imag+a.imag*b.real};}
char S[200010];
int rev[1<<19];
cp A[1<<19],omg[1<<19],inv[1<<19];
il vd fft(cp*A,int n,cp*omg){
for(int i=0;i<n;++i)if(rev[i]>i)std::swap(A[i],A[rev[i]]);
for(int o=1;o<n;o<<=1)
for(cp*p=A;p!=A+n;p+=o<<1)
for(int i=0;i<o;++i){
cp t=omg[n/(o<<1)*i]*p[i+o];
p[i+o]=p[i]-t,p[i]=p[i]+t;
}
}
int t[200010];
il int pow(int x,int y){
int ret=1;
while(y){
if(y&1)ret=1ll*ret*x%mod;
x=1ll*x*x%mod;y>>=1;
}
return ret;
}
int r[200010];
int main(){
scanf("%s",S+1);int n=strlen(S+1);
int N=1,lg=0;while(N<(n+2)<<1)N<<=1,++lg;
for(int i=0;i<N;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<lg-1);
for(int i=0;i<N;++i)omg[i]=cp(cos(i*2*pi/N),sin(i*2*pi/N)),inv[i]=omg[i].conj();
for(int i=1;i<=n;++i)A[i]=S[i]=='a';
fft(A,N,omg);
for(int i=0;i<N;++i)A[i]=A[i]*A[i];
fft(A,N,inv);
for(int i=1;i<=n<<1;++i)t[i]=(int)(A[i].real/N+0.5);
for(int i=0;i<N;++i)A[i]=0;
for(int i=1;i<=n;++i)A[i]=S[i]=='b';
fft(A,N,omg);
for(int i=0;i<N;++i)A[i]=A[i]*A[i];
fft(A,N,inv);
for(int i=1;i<=n<<1;++i)t[i]+=(int)(A[i].real/N+0.5);
ll ans=0;
for(int i=1;i<=n<<1;++i)t[i]=t[i]/2+!(i&1),ans+=pow(2,t[i])-1;
for(int i=n;i;--i)S[i<<1]=S[i];
N=n<<1|1;
for(int i=1;i<=N;i+=2)S[i]='#';
S[0]='s',S[N+1]='t';
int R=1,mid=1;r[1]=1;
for(int i=2;i<=N;++i){
r[i]=1;
if(i<=R)r[i]=std::min(R-i+1,r[mid*2-i]);
while(S[i-r[i]]==S[i+r[i]])++r[i];
if(i+r[i]-1>R)mid=i,R=i+r[i]-1;
}
for(int i=1;i<=N;++i)ans-=r[i]>>1;
printf("%lld\n",(ans%mod+mod)%mod);
return 0;
}

洛咕 P4199 万径人踪灭的更多相关文章

  1. 洛谷P4199 万径人踪灭(manacher+FFT)

    传送门 题目所求为所有的不连续回文子序列个数,可以转化为回文子序列数-回文子串数 回文子串manacher跑一跑就行了,考虑怎么求回文子序列数 我们考虑,如果$S_i$是回文子序列的对称中心,那么只要 ...

  2. 洛咕3312 [SDOI2014]数表

    洛咕3312 [SDOI2014]数表 终于独立写出一道题了...真tm开心(还是先写完题解在写的) 先无视a的限制,设\(f[i]\)表示i的约数之和 不妨设\(n<m\) \(Ans=\su ...

  3. 洛咕 P3700 [CQOI2017]小Q的表格

    洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...

  4. 洛咕 P2336 [SCOI2012]喵星球上的点名

    洛咕 P2336 [SCOI2012]喵星球上的点名 先求出SA和height,一个点名串对应的就是一段区间,还有很多个点,就转化成了 有很多个区间,很多个点集,对每个区间计算和多少个点集有交,对每个 ...

  5. 洛咕 P4131 [WC2005]友好的生物

    洛咕 P4131 [WC2005]友好的生物 首先可以发现\(C\)是没有用的,可以乘进所有的权值里面做 考虑没有最后一维的限制,那么两个生物的友好值就是 \(\sum_{i=1}^k|a_i-b_i ...

  6. 洛咕 P4528 [CTSC2008]图腾

    洛咕 P4528 [CTSC2008]图腾 神题orz. 先约定abcd表示\(1\leq A<B<C<D\leq n\),而且\(y_a,y_b,y_c,y_d\)的排名正好是\( ...

  7. 洛咕P3250 [HNOI2016]网络 整体二分

    这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...

  8. 洛咕 P2480 [SDOI2010]古代猪文

    洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...

  9. 洛咕 P2155 [SDOI2008]沙拉公主的困惑

    洛咕 P2155 [SDOI2008]沙拉公主的困惑 有个结论,就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\).证明比较显然. 所以这个题目要问的\(n!\)就可以分成\ ...

随机推荐

  1. 使用UISearchDisplayController

    使用UISearchDisplayController 虽然UISearchDisplayController名字中带有controller,可他不是一个UIView相关的controller,因为, ...

  2. C# HttpWebRequest 笔记

    目录: 1,HttpWebRequest 实例化 2,GetResponse 获取请求结果 3,获取结果 4,获取流信息 HttpWebRequest 是一个Http 请求类,继承于 WebReque ...

  3. November 8th 2016 Week 46th Tuesday

    When he can't, he tries a new way to share a new pair. 当他做不到时,他尝试一种新的方式:分享. To share, your failing e ...

  4. Keepalived + haproxy双机高可用方案

    上一篇文章已经讲到了keepalived实现双机热备,且遗留了一个问题 master的网络不通的时候,可以立即切换到slave,但是如果只是master上的应用出现问题的时候,是不会 主动切换的. 上 ...

  5. 前端技术-HTML页面的加载

    HTML页面的加载 HTML页面的加载实际上是基于http过程+浏览器对数据的解析渲染. http协议的请求过程是基于TCP协议的.http是要基于TCP连接基础上,简单的说,TCP单纯建立连接,不涉 ...

  6. linux 用户和组及文件权限的相关内容

    1.添加用户(只有管理员用户或具有管理员权限的用户可以添加删除用户) useradd  用户名 (laoda)  新创建用户后home下会多一个laoda的目录 ,此目录中存放的是laoda用户相关的 ...

  7. 4518: [Sdoi2016]征途

    Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...

  8. luogu P3391 【模板】文艺平衡树(Splay)

    嘟嘟嘟 突然觉得splay挺有意思的-- 这道题只有一个任务:区间翻转. 首先应该知道的是,splay和线段树一样,都可以打标记,然后走到每一个节点之前先下传. 那怎么打标记呢?还应该有"区 ...

  9. Kubernetes中的资源调度与资源管理

    一.scheduling:把pod放到node上 1.最小调度单元:pod 2.1.8的版本后,最大支持5000个node 3.scheduling由两个部分组成: 3.1 Predicates:过滤 ...

  10. package结构

    1.package结构 一个package下常见的文件. 路径有:├── CMakeLists.txt #package的编译规则(必须)├── package.xml #package的描述信息(必 ...