P4199-万径人踪灭【FFT】

正题

题目链接:https://www.luogu.com.cn/problem/P4199


题目大意

给出一个只包含a,ba,ba,b的字符串

求有多少个不连续的回文子序列(字母回文,位置对称)

1≤n≤1051\leq n\leq 10^51n105


解题思路

这个不连续一看就很nt,考虑求出所有的再减去连续的

对于每个对称轴来说,a,ba,ba,b分开考虑贡献再乘起来再减去一(两个都为空)。

加入计算aaa的贡献,就是看有多少对aaa以它为对称轴,设为kkk对,那么方案就是2k2^k2k

怎么对于每个对称轴快速计算有多少对?也就是每对aaa都会对他们的对称轴产生贡献,假设iiijjj都是aaa,那么对称轴就是i+j2\frac{i+j}{2}2i+j,这个直接FFTFFTFFT就可以了

然后bbb同理。

然后字符串hash+二分计算连续的方案就好了

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define ull unsigned long long
using namespace std;
const ll N=4e5+10,P=998244353,p=1e9+7;
const ull g=131;
ll n,l,a[N],b[N],r[N],ans;
ull pw[N],h[N],d[N];
char s[N];
ll power(ll x,ll b,ll P){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void NTT(ll *f,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll tmp=power(3,(P-1)/p,P),len=(p>>1);if(op==-1)tmp=power(tmp,P-2,P);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=buf*f[i+len]%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll invn=power(n,P-2,P);for(ll i=0;i<n;i++)f[i]=f[i]*invn%P;}return;
}
ull geth(ll l,ll r)
{return h[r]-h[l-1]*pw[r-l+1];}
ull getd(ll l,ll r)
{return d[l]-d[r+1]*pw[r-l+1];}
signed main()
{scanf("%s",s);l=strlen(s);for(ll i=0;i<l;i++)a[i]=(s[i]=='a'),b[i]=(s[i]=='b');n=1;while(n<2*l)n<<=1;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);NTT(a,1);NTT(b,1);for(ll i=0;i<n;i++)a[i]=a[i]*a[i]%P,b[i]=b[i]*b[i]%P;NTT(a,-1);NTT(b,-1);for(ll i=0;i<n;i++)a[i]=(a[i]+1)/2,b[i]=(b[i]+1)/2;for(ll i=0;i<n;i++)(ans+=power(2,a[i]+b[i],p)%p-1)%=p;pw[0]=1;for(ll i=1;i<=l;i++)pw[i]=pw[i-1]*g;for(ll i=1;i<=l;i++)h[i]=h[i-1]*g+s[i-1]-'a';for(ll i=l;i>=1;i--)d[i]=d[i+1]*g+s[i-1]-'a';for(ll i=1;i<=l;i++){ll L=1,R=min(i,l-i+1)-1;while(L<=R){ll mid=(L+R)>>1;if(geth(i-mid,i+mid)==getd(i-mid,i+mid))L=mid+1;else R=mid-1;}ans-=R+1;}for(ll i=1;i<l;i++){ll L=1,R=min(i,l-i);while(L<=R){ll mid=(L+R)>>1;if(geth(i-mid+1,i+mid)==getd(i-mid+1,i+mid))L=mid+1;else R=mid-1;}ans-=R;}printf("%lld\n",(ans%p+p)%p);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾

前天, 2018年11月10日, 广州图书馆\微软云开发者社区\广东职业教育信息化研究会\珠三角技术沙龙在广州图书馆负一层1号报告厅搞了一场”微软最有价值专家(MVP)广州分享会 - MonkeyFest 2018广州分享会”. 这是在广州图书馆官方微信公众号上的活动报名链接: https://mp.weixin.q…

[蓝桥杯][2017年第八届真题]发现环

题目链接 题目描述 小明的实验室有N台电脑&#xff0c;编号1~N。原本这N台电脑之间有N-1条数据链接相连&#xff0c;恰好构成一个树形网络。在树形网络上&#xff0c;任意两台电脑之间有唯一的路径相连。 不过在最近一次维护网络时&#xff0c;管理员误操作使得某两台电脑之间增…

P7323-[WC2021]括号路径【并查集,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P7323 题目大意 给出nnn个点的一张有向图。每个边(u,v,w)(u,v,w)(u,v,w)表示u−>vu->vu−>v有一个类型www的左括号边&#xff0c;v−>uv->uv−>u有一个类型www的右括号边。 求图中有多少点对满足它们之间…

P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)

P3565 [POI2014]HOT-Hotels 参考题解 题目大意&#xff1a; 给定一棵树&#xff0c;在树上选 3 个点&#xff0c;要求两两距离相等&#xff0c;求方案数。 三个点树上两两距离为d存在下面两种情况 某个点三个子树&#xff08;保证该点是LCA&#xff09;中分别由三个点距离它为…

C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出

差点造了一整个轮子.Net Framework 4.5 里面的RSA功能&#xff0c;并未提供简单对PEM密钥格式的支持&#xff08;.Net Core有咩&#xff1f;&#xff09;&#xff0c;差点&#xff08;还远着&#xff09;造了一整个轮子&#xff0c;就为了支持PEM PKCS#8、PKCS#1格式密钥对的导…

P4494-[HAOI2018]反色游戏【圆方树】

正题 题目链接:https://www.luogu.com.cn/problem/P4494 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;节点有0/10/10/1&#xff0c;每条边可以选择是否取反两边的点。 开始求将所有节点变为000的方案&#xff0c;然后对于每个点询问删去这个点之后的方案 1≤T≤5,1…

福州首届.NET开源社区技术交流会圆满成功

活动总结2018年11月10日周六的下午&#xff0c;在福州蒲公英创新工场举办了福州首届.NET开源社区技术交流会&#xff0c;来自福建省各大科技公司的技术小伙伴齐聚一堂&#xff0c;为了就是能在现场学习到微软跨平台技术.NET Core、微服务以及Azure云服务。在交流会现场&#xf…

【模板】高精度

ACM模板 #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct bign {int d[200010], len;bign() { memset(d, 0, sizeof d); len 1; }bign(int num) { *this num; }big…

POJ3734-Blocks【EGF】

正题 题目链接:http://poj.org/problem?id3734 题目大意 用思种颜色给nnn个格子染色&#xff0c;要求前两种颜色出现偶数次&#xff0c;求方案。 1≤T≤100,1≤n≤1091\leq T\leq 100,1\leq n\leq 10^91≤T≤100,1≤n≤109 解题思路 反正是EGF\text{EGF}EGF的十分入门题了。…

[蓝桥杯][2017年第八届真题]对局匹配

题目描述 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分&#xff0c;代表他的围棋水平。 小明发现网站的自动对局系统在匹配对手时&#xff0c;只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K&#xff0c;系统都不会将他们…

codeforce23 E. Tree(高精度+树形dp)

E. Tree 状态表示&#xff1a;fu,jf_{u,j}fu,j​表示以uuu节点的子树&#xff0c;uuu所在连通块大小为jjj时&#xff0c;并且没有算上uuu连通块的贡献的最大值 状态计算&#xff1a; 对于一棵子树vvv来说&#xff0c;显然可以有两种情况 uuu节点与vvv节点不连通&#xff1a;fu…

.NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

引子为什么写这篇文章呢&#xff1f;因为.NET Core的生态越来越好了&#xff01;之前玩转.net的时候操作Redis相信大伙都使用过一些组件&#xff0c;但都有一些缺点&#xff0c;如ServiceStack.Redis 是商业版&#xff0c;免费版有限制&#xff1b;StackExchange.Redis 是免费版…

CF891E-Lust【EGF】

正题 题目链接:https://www.luogu.com.cn/problem/CF891E 题目大意 nnn个数字的一个序列aia_iai​&#xff0c;每次随机选择一个让它减去一。然后贡献加上所有其他aia_iai​的乘积。 执行kkk次&#xff0c;求贡献答案。 1≤n≤5000,0≤ai,k≤1091\leq n\leq 5000,0\leq a_i,k…

P2495 [SDOI2011]消耗战(树形dp+虚树)

P2495 [SDOI2011]消耗战 树形dp 状态表示&#xff1a;fuf_ufu​表示以uuu为根的子树中&#xff0c;uuu节点与子树中的关键的“隔开”所需要的最小代价 状态转移&#xff1a; 考虑uuu的一个儿子vvv vvv是关键点&#xff1a;fufuwu→vf_uf_uw_{u\to v}fu​fu​wu→v​vvv不是关键…

牛客题霸 车站建造问题 C++题解/答案

题目描述 有108个村庄排在一条公路上&#xff0c;依次编号为0~108-1&#xff0c;相邻村庄距离为1&#xff0c;其中有n个村庄居住着牛牛&#xff0c;居住着牛牛的村庄从小到大依次为a0~an-1&#xff0c;其中保证a00. 现在需要建设车站&#xff0c;有两个要求必须被满足&#xf…

【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

上篇文章我们介绍了如何扩展Ocelot网关&#xff0c;并实现数据库存储&#xff0c;然后测试了网关的路由功能&#xff0c;一切都是那么顺利&#xff0c;但是有一个问题未解决&#xff0c;就是如果网关配置信息发生变更时如何生效&#xff1f;以及我使用其他数据库存储如何快速实…

P5666-[CSP-S2019]树的重心【树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P5666 题目大意 给出nnn个点的一棵树&#xff0c;对于每条边割掉后两棵树重心编号和。 1≤T≤5,1≤n≤2999951\leq T\leq 5,1\leq n\leq 2999951≤T≤5,1≤n≤299995 解题思路 编号和&#xff0c;所以应该是要我们枚举点然后…

牛客题霸 牛妹的蛋糕 C++题解/答案

题目描述 众所周知&#xff0c;牛妹非常喜欢吃蛋糕。 第一天牛妹吃掉蛋糕总数三分之一&#xff08;向下取整&#xff09;多一个&#xff0c;第二天又将剩下的蛋糕吃掉三分之一&#xff08;向下取整&#xff09;多一个&#xff0c;以后每天吃掉前一天剩下的三分之一&#xff08…

计算机提示找不到vcruntime140.dll,无法继续执行代码怎么办?如何修复

“找不到vcruntime140.dll&#xff0c;无法继续执行代码”。这个问题可能会让你感到困惑&#xff0c;不知道如何解决。那么&#xff0c;vcruntime140.dll是什么文件&#xff1f;它为什么会丢失&#xff1f;又该如何解决这个问题呢&#xff1f;本文将为你详细介绍vcruntime140.d…

codeforces1486 F. Pairs of Paths(倍增+树上数数)

F. Pairs of Paths syksykCCC题解 iamhpp题解 首先说明&#xff0c;下面图片来自第一篇博客&#xff0c;下面代码照抄第二篇博客 对没有啥是自己写的&#xff08;因为我太菜~~ 从上图可以看出两条链只有一个交点可能有两种情况 交点是两条链的LCA交点是一条链的LCA而不是另一…