【BZOJ3160】万径人踪灭

Description

Input

Output

Sample Input

Sample Output

HINT

题解:自己想出来1A,先撒花~(其实FFT部分挺裸的)

做这道题,第一思路很重要,显然看到这题的第一想法就是ans=总数-不合法(不要问我为什么显然)。因为向这种用补集法的题一般都会给一些很奇葩的限制条件,但是一旦换个角度去想就很水了,好了不多说废话了。

显然,不合法的情况,也就是连续的回文区间的方案数,我们直接上Manacher就搞定了嘛!答案就是所有对称轴的(最长回文串长度+1)/2之和(是的,很显然)

对于不合法的情况,我们发现两串对称的情况跟卷积的形式类似(FFT做多了吧?),但是问题来了,怎么构造出一个卷积,使得它的值就是回文子串的个数呢?

我们发现原串只有a或b,所以思考能不能构造出一种卷积,使得对应位置的值跟下面一样

a*b->0       b*a->0        a*a->1     b*b->1

如果把a看成0,b看成1,这显然是一个异或,然而并没什么卵用。但我们如果把a看成0,b看成1,可以满足只有b*b是1,其他都是0;同理,把a看成1,b看成0,可以满足只有a*a是1,其他都是0,然后我们对这两种情况分别求一次卷积,就能得到:以i为对称中心的最长子序列的回文半径长度。这里注意一下,用于是两个一样的多项式相乘,所以每对字符会被算成两次(单个字符自我对称的除外),所以我们要的回文半径应该是(x+1)/2

然而半径长度并不是方案数,由于每对对称的字符都可以选或不选,所以对答案的贡献就是2^长度-1(因为你不能一个也不选吧?)

好吧,感觉说了这么多又有点说不明白了,所以欢迎提问和hack~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#define pi acos(-1.0)
#define mod 1000000007
using namespace std;
int n,ans;
struct cp
{double x,y;cp (double a,double b){x=a,y=b;}cp (){}cp operator + (cp a){return cp(x+a.x,y+a.y);}cp operator - (cp a){return cp(x-a.x,y-a.y);}cp operator * (cp a){return cp(x*a.x-y*a.y,x*a.y+y*a.x);}
}n1[1<<20],n2[1<<20];
int s[1<<20],ret[1<<20],rl[1<<20],pn[1<<20];
char str[1<<20];
void FFT(cp *a,int len,int f)
{int i,j,k,h;cp t;for(i=k=0;i<len;i++){if(i>k)    swap(a[i],a[k]);for(j=(len>>1);(k^=j)<j;j>>=1);}for(h=2;h<=len;h<<=1){cp wn(cos(f*2*pi/h),sin(f*2*pi/h));for(j=0;j<len;j+=h){cp w(1.0,0);for(k=j;k<j+h/2;k++)    t=w*a[k+h/2],a[k+h/2]=a[k]-t,a[k]=a[k]+t,w=w*wn;}}
}
void work(cp *a,cp *b,int len)
{FFT(a,len,1),FFT(b,len,1);for(int i=0;i<len;i++) a[i]=a[i]*b[i];FFT(a,len,-1);for(int i=0;i<len;i++)  ret[i]+=(int)(a[i].x/len+0.1);
}
int main()
{scanf("%s",str);int i,mx,pos,len=strlen(str);for(i=0;i<len;i++)   s[n++]=0,s[n++]=str[i]-'a';s[n++]=0;for(mx=-1,i=0;i<n;i++){if(mx>i)    rl[i]=min(mx-i+1,rl[2*pos-i]);else    rl[i]=1;for(;i+rl[i]<n&&rl[i]<=i&&s[i+rl[i]]==s[i-rl[i]];rl[i]++);if(mx<i+rl[i]-1)    mx=i+rl[i]-1,pos=i;}for(i=0;i<n;i++)   ans=(ans-rl[i]/2+mod)%mod;for(len=1;len<2*n;len<<=1);for(i=0;i<len;i++)  n1[i]=n2[i]=cp(0,0);for(i=1;i<n;i+=2)   n1[i]=n2[i]=cp(s[i],0);work(n1,n2,len);for(i=0;i<len;i++)   n1[i]=n2[i]=cp(0,0);for(i=1;i<n;i+=2)   n1[i]=n2[i]=cp(s[i]^1,0);work(n1,n2,len);for(pn[0]=i=1;i<=n;i++)  pn[i]=(pn[i-1]<<1)%mod;for(i=0;i<n;i++)    ans=(ans+pn[(ret[i<<1]+(i&1))>>1]-1)%mod;printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/6890700.html

【BZOJ3160】万径人踪灭 Manacher+FFT相关推荐

  1. 【BZOJ3160】 万径人踪灭(FFT,manacher)

    前言 多项式真的很难♂啊qwq Solution 考虑求的是一个有间隔的回文串,相当于是: 总的答案-没有间隔的答案 考虑总的答案怎么计算?FFT卷一下就好了. 对于每一位字符,有两种取值,然后随便卷 ...

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

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

  3. 【BZOJ 3160】 3160: 万径人踪灭 (FFT)

    3160: 万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1440  Solved: 799 Description Input Out ...

  4. BZOJ3160:万径人踪灭

    Description Input & Output & Sample Input & Sample Output HINT 题解: 题意即求不连续但间隔长度对称的回文串个数. ...

  5. BZOJ3160: 万径人踪灭

    设a[i]=bool(s[i]=='a'),b[i]=bool(s[i]=='b'),考虑a和a.b和b的卷积,由于卷积是对称的,就可以统计出不连续回文子串个数了.可能说得比较简略.再用manache ...

  6. 【bzoj3160】万径人踪灭

    题意:给一个只含a.b的字符串,求所有的回文不连续子序列. manacher+FFT. 先求出所有回文序列,再减去连续子序列(即回文串). 将a.b分开考虑,对于一个对称轴,以其为回文中心的回文序列的 ...

  7. manacher算法学习(求最长回文子串长度)

    Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...

  8. BZOJ 3160 FFT+Manacher

    思路: 这道题思路好奇怪--. 我们先要知道关于x (x可以是间隙) 对称的有几对字母 显然暴力是n^2的 那怎么办呢 先把所有'a'看成1 'b'看成0 意外的发现 这不就是卷积嘛 再倒过来搞一搞 ...

  9. bzoj3160(FFT+回文自动机)

    题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=3160 题解 先把问题转化一下,我们要求的是非连续对称回文子序列. ans=回文子序列数- ...

最新文章

  1. 016_Servlet上下文
  2. 记录一次CPLD资源过少、时序伪例的解决办法
  3. 802.11协议之BA/BAR帧
  4. 计算 的程序java_数学表达式计算程序(java)
  5. RabbitMQ之惰性队列(Lazy Queue)
  6. matlab求迟滞,MATLAB PI迟滞模型问题
  7. SQL Server where语句使用举例
  8. js一键批量打印_为什么我推荐你用3D打印技术制造模具?
  9. Slim生成的ckpt文件转PB文件
  10. [6]2020-WACV-Adversarial Sampling for Active Learning论文笔记
  11. 云服务器obs_华为云服务器ECS挂载对象存储服务OBS教程
  12. php百度知道小偷,随风百度知道(小偷采集) php版 v2.0.0X
  13. java工程师职业价值观_什么是职业价值观?舒伯职业价值观测试
  14. 带经纬度的水印相机_经纬度生成小工具(仿水印相机)
  15. NEF格式文件转换为JPG格式
  16. 打开和切换文件的基础方法(DOS)命令
  17. 2019年9月全国计算机二级准考证打印,2019年9月计算机二级准考证打印入口公布...
  18. vue前后端分离图片无法显示的问题
  19. 【zookeeper】Apache curator优点介绍
  20. 开启邮箱的SMTP服务获取授权码(QQ邮箱、163邮箱)

热门文章

  1. IIS ARR设置HTTP跳转到HTTPS
  2. HTML 5 的自定义 data-* 属性和jquery的data()方法的使用
  3. 《Windows游戏编程大师技巧》三、Windows高级编程
  4. [原]RHCS集群的服务切换测试札记
  5. 分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)
  6. 监控工具之zabbix server3.4 部署配置
  7. KAFKA介绍(分布式架构)
  8. jquery validate表单验证插件
  9. Framework打包
  10. Firemonkey Android IOS 图标