博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3160 万径人踪灭 —— FFT
阅读量:4969 次
发布时间:2019-06-12

本文共 1606 字,大约阅读时间需要 5 分钟。

题目:

求出关于一个位置有多少对对称字母,如果 i 位置有 f[i] 对,对答案的贡献是 2^f[i] - 1;

然后减去连续的,用 manachar 求出回文长度,每个位置作为边界都是一种不合法情况;

求对称,首先把字符串中间穿插字符 '$',于是字符串的长度变成2倍;

考虑一对字母 s[x],s[y],如果 s[x] = s[y],其对称中心是 (x+y)/2;

放在加入字符后的字符串中,对称中心就是 x+y;

所以可以看出卷积了:f[i] = ∑(0<=j<=i) (s[j]==s[i-j]),其中 i 视为新字符串中的位置,j 和 i-j 视为原字符串中的位置;

注意卷积和 manachar 算的个数都要包括自己成对,否则判断挺麻烦...

这里卷积的两个多项式其实是一样的,所以只要用 FFT 算出一个,然后自己乘起来即可;

做下一步的时候注意清空,别忘了清空 n~lim 部分的值;

处理 bin 的边界是 n 而非 n-1,因为最多可能有 n 对。

(学习了 manachar 的简洁写法)

代码如下:

#include
#include
#include
#include
#include
using namespace std;typedef double db;int const xn=(1<<19),mod=1e9+7;db const Pi=acos(-1.0);int n,rev[xn],lim=1,l,len[xn],bin[xn],c[xn];char ch[xn];struct com{db x,y;}a[xn],b[xn],aa[xn];com operator + (com a,com b){
return (com){a.x+b.x,a.y+b.y};}com operator - (com a,com b){
return (com){a.x-b.x,a.y-b.y};}com operator * (com a,com b){
return (com){a.x*b.x-a.y*b.y,a.x*b.y+b.x*a.y};}int upt(int x){
while(x>=mod)x-=mod; while(x<0)x+=mod; return x;}void fft(com *a,int tp){ for(int i=0;i
>1]; for(int i=1;i<=n+n;i++) { if(i
=0&&i+len[i]<=n+n&&s[i-len[i]]==s[i+len[i]])len[i]++; if(i+len[i]>mx)mx=i+len[i],id=i; ret=upt(ret+len[i]/2); } return ret;}int main(){ scanf("%s",ch); n=strlen(ch); while(lim<=n+n)lim<<=1,l++;// for(int i=0;i
>1]>>1)|((i&1)<<(l-1))); bin[0]=1; for(int i=1;i<=n;i++)bin[i]=upt(bin[i-1]+bin[i-1]); solve(); int ans=0; for(int i=0;i
>1]-1);//+1 -1 printf("%d\n",upt(ans-manachar())); return 0;}

 

转载于:https://www.cnblogs.com/Zinn/p/10022461.html

你可能感兴趣的文章
Java中对List集合内的元素进行顺序、倒序、随机排序的示例代码
查看>>
css选择器
查看>>
看懂下面C++代码才说你理解了C++多态虚函数!
查看>>
ASP.NET上传下载文件
查看>>
Galaxy Nexus 全屏显示-隐藏Navigation Bar
查看>>
Mob-第三方分享 /手机验证码
查看>>
Spring中使用Velocity模板
查看>>
实现model中的文件上传FTP(一)
查看>>
MonkeyRecorder
查看>>
Maven概述
查看>>
上周热点回顾(8.18-8.24)
查看>>
Feature toggle
查看>>
day02
查看>>
我是怎么招聘程序员的
查看>>
gvim 配置Pydiction
查看>>
Linux安装指定mysql版本
查看>>
Exception in thread "main" java.lang.ClassNotFoundException: 解决方法
查看>>
移动应用(手机应用)开发IM聊天程序解决方案
查看>>
[转载] K3漏油器全紫铜替换原硅胶垫教程。标准姿势
查看>>
python set
查看>>