题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3160

我是一个傻叉 微笑脸

  1. #include<bits/stdc++.h>
  2. #define inf 1000000000
  3. #define ll long long
  4. #define N 200005
  5. #define mod 1000000007
  6. using namespace std;
  7. int read(){
  8. int x=,f=;char ch=getchar();
  9. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  10. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  11. return x*f;
  12. }
  13. struct CD{
  14. double x,y;
  15. CD(double a=,double b=){x=a;y=b;}
  16. friend CD operator + (CD n1,CD n2){return CD(n1.x+n2.x,n1.y+n2.y);}
  17. friend CD operator - (CD n1,CD n2){return CD(n1.x-n2.x,n1.y-n2.y);}
  18. friend CD operator * (CD n1,CD n2){return CD(n1.x*n2.x-n1.y*n2.y,n1.x*n2.y+n1.y*n2.x);}
  19. };
  20. const double Pi=acos(-1.0);
  21. int bit,n,nn,ans,m,mx,id,p[N<<];
  22. char s[N],st[N<<];
  23. CD a[N<<],b[N<<];
  24. void FFT(CD *a,int n,int type){
  25. for(int i=,j=;i<n;i++) {
  26. if(j>i)swap(a[i],a[j]);
  27. int k=n;
  28. while(j&(k >>= ))j&=~k;
  29. j|=k;
  30. }
  31. for(int i=;i<=bit;i++){
  32. CD w_n(cos(*type*Pi/(<<i)),sin(*type*Pi/(<<i)));
  33. for(int j=;j<n;j+=(<<i)){
  34. CD w(,);
  35. for(int k=j;k<j+(<<(i-));k++){
  36. CD tmp=a[k],tt=w*a[k+(<<(i-))];
  37. a[k]=tmp+tt;
  38. a[k+(<<(i-))]=tmp-tt;
  39. w=w*w_n;
  40. }
  41. }
  42. }
  43. if(type<)for(int i=;i<n;i++)a[i].x/=n;
  44. }
  45. int main(){
  46. scanf("%s",s);
  47. n=strlen(s);nn=n;
  48. bit=;
  49. while((<<bit)<(n<<))bit++;
  50. n=<<bit;
  51. for(int i=nn;i<n;i++)a[i]=b[i]=CD(,);
  52. for(int i=;i<nn;i++)if(s[i]=='a')a[i]=CD(,);
  53. FFT(a,n,);
  54. for(int i=;i<n;i++)a[i]=a[i]*a[i];
  55. FFT(a,n,-);
  56.  
  57. for(int i=;i<nn;i++)if(s[i]=='b')b[i]=CD(,);
  58. FFT(b,n,);
  59. for(int i=;i<n;i++)b[i]=b[i]*b[i];
  60. FFT(b,n,-);
  61.  
  62. for(int i=;i<n;i++){
  63. int x=round(a[i].x+b[i].x);
  64. x=(x+)/;
  65. ans=(ans+(<<x)-)%mod;
  66. }
  67.  
  68. m=nn<<|;
  69. for(int i=;i<nn;i++)st[(i+)<<]=s[i];
  70. mx=id=;
  71. for(int i=;i<=m;i++){
  72. if(mx>i)p[i]=min(p[*id-i],mx-i);else p[i]=;
  73. while(i-p[i]->&&i+p[i]+<=m&&st[i-p[i]-]==st[i+p[i]+])p[i]++;
  74. if(i+p[i]>mx)mx=i+p[i],id=i;
  75. ans=((ans-(p[i]+)/)%mod+mod)%mod;
  76. }
  77. printf("%d\n",ans);
  78. return ;
  79. }

【bzoj3160】万径人踪灭 FFT的更多相关文章

  1. BZOJ3160:万径人踪灭(FFT,Manacher)

    Solution $ans=$回文子序列$-$回文子串的数目. 后者可以用$manacher$直接求. 前者设$f[i]$表示以$i$为中心的对称的字母对数. 那么回文子序列的数量也就是$\sum_{ ...

  2. BZOJ3160 万径人踪灭 字符串 多项式 Manachar FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8810140.html 题目传送门 - BZOJ3160 题意 给你一个只含$a,b$的字符串,让你选择一个子序列 ...

  3. BZOJ3160 万径人踪灭(FFT+manacher)

    容易想到先统计回文串数量,这样就去掉了不连续的限制,变为统计回文序列数量. 显然以某个位置为对称轴的回文序列数量就是2其两边(包括自身)对称相等的位置数量-1.对称有啥性质?位置和相等.这不就是卷积嘛 ...

  4. BZOJ3160 万径人踪灭 【fft + manacher】

    题解 此题略神QAQ orz po神牛 由题我们知道我们要求出: 回文子序列数 - 连续回文子串数 我们记为ans1和ans2 ans2可以用马拉车轻松解出,这里就不赘述了 问题是ans1 我们设\( ...

  5. BZOJ3160: 万径人踪灭(FFT,回文自动机)

    BZOJ传送门: 解题思路: FFT在处理卷积时可以将自己与自己卷,在某一种字母上标1其他标0,做字符集次就好了. (回文就是直接对称可以联系偶函数定义理解,根据这个性质就可以将字符串反向实现字符串匹 ...

  6. [bzoj3160]万径人踪灭_FFT_Manacher

    万径人踪灭 bzoj-3160 题目大意:给定一个ab串.求所有的子序列满足:位置和字符都关于某条对称轴对称而且不连续. 注释:$1\le n\le 10^5$. 想法: 看了大爷的题解,OrzOrz ...

  7. BZOJ 3160: 万径人踪灭 [fft manacher]

    3160: 万径人踪灭 题意:求一个序列有多少不连续的回文子序列 一开始zz了直接用\(2^{r_i}-1\) 总-回文子串 后者用manacher处理 前者,考虑回文有两种对称形式(以元素/缝隙作为 ...

  8. bzoj 3160 万径人踪灭 FFT

    万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1936  Solved: 1076[Submit][Status][Discuss] De ...

  9. BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher

    BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...

随机推荐

  1. poj 1611:The Suspects(并查集,经典题)

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 21472   Accepted: 10393 De ...

  2. <转>Java 常用排序算法小记

    排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...

  3. jQuery.fn.extend与jQuery.extend到底区别在哪?

    正文: 其实说白了,从两个方法本身就能看出来端倪. 我们先把jQuery看成了一个类,这样好理解一些. jQuery.extend(),是扩展的jQuery这个类. 假设我们把jQuery这个类看成是 ...

  4. 在Visualforce page中用自带的控件实现Ajax回调后台方法(并且可以用js去动态给parameters赋值)

    这里用的组合是:apex:commandLink  + apex:actionFunction + apex:outputPanel 这里的 apex:commandLink 和 apex:actio ...

  5. java线程之——synchronized的注意细节

    我在学习synchronized的时候,十分好奇当一个线程进入了一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 然后就做了个实验(实验代码最后贴出),最后得到了如下 ...

  6. strcmp函数的使用

    Action() { /*********************************   * Author:旺仔   * object:strcmp   * date:2015-12-09    ...

  7. 单机c1000k连接

    单机c1000k连接即单机实现百万连接,首先要注意的是连接是虚拟的逻辑的,连接最终落于 网卡,清晰概念才能更深入更清晰的想出问题的解决办法. 参考 http://www.ideawu.net/blog ...

  8. PHP 自带查询运行内存的函数

    memory_get_usage - 返回分配给 PHP 的内存量 int memory_get_usage ([ bool $real_usage = false ] ) 返回当前分配给你的 PHP ...

  9. 【转】linux network namespace 学习

    原文地址:https://segmentfault.com/a/1190000004059167 介绍 在专业的网络世界中,经常使用到Virtual Routing and Forwarding(VR ...

  10. iOS NSDate获取当前时间并格式化

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"yyyy-MM- ...