3160: 万径人踪灭

题意:求一个序列有多少不连续的回文子序列


一开始zz了直接用\(2^{r_i}-1\)

总-回文子串

后者用manacher处理

前者,考虑回文有两种对称形式(以元素/缝隙作为对称轴)

f[i],i为奇数表示以缝隙对称,偶数表示以元素i>>1对称,对答案的贡献就是\(2^{f[i]}-1\)
\[ f[i] = \sum_{j=1}^{i-1} [s_j = s_{i-j}] \]
就是裸卷积

因为只有a,b两个字符,可以先后令a或b=1分别求

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define fir first
#define sec second
typedef long long ll;
const int N=(1<<19)+5, mo=1e9+7;
const double PI = acos(-1);
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;
}struct meow{double x, y;meow(double a=0, double b=0):x(a), y(b){}
};
meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);}
meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);}
meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);}
meow conj(meow a) {return meow(a.x, -a.y);}
typedef meow cd;namespace fft {int n, rev[N];void ini(int lim) {n=1; int k=0; while(n<lim) n<<=1, k++;for(int i=0; i<n; i++) rev[i] = (rev[i>>1]>>1) | ((i&1)<<(k-1));}void dft(cd *a, int flag) {for(int i=0; i<n; i++) if(i<rev[i]) swap(a[i], a[rev[i]]);for(int l=2; l<=n; l<<=1) {int m = l>>1;cd wn = cd(cos(2*PI/l), flag * sin(2*PI/l));for(cd *p=a; p != a+n; p+=l) {cd w(1, 0);for(int k=0; k<m; k++) {cd t = w * p[k+m];p[k+m] = p[k] - t;p[k] = p[k] + t;w = w*wn;}}}if(flag == -1) for(int i=0; i<n; i++) a[i].x /= n;}void mul(cd *a) {dft(a, 1);for(int i=0; i<n; i++) a[i] = a[i] * a[i];dft(a, -1);}
} cd a[N];
int n, f[N]; ll ans;
char s[N];
ll Pow(ll a, int b) {ll ans=1;for(; b; b>>=1, a=a*a%mo)if(b&1) ans=ans*a%mo;return ans;
}
inline void mod(ll &x) {if(x<0) x+=mo; else if(x>=mo) x-=mo;}namespace ma {int r[N]; char a[N];ll manacher(char *s, int n) {int p=0, a; ll ans=0;for(int i=1; i<=n; i++) {r[i] = i<p ? min(p-i+1, r[2*a-i]) : 1;while(s[ i-r[i] ] == s[ i+r[i] ]) r[i]++;if(i+r[i]-1 > p) p = i+r[i]-1, a=i;mod(ans += r[i]>>1);}return ans;}ll cal(char *s) {for(int i=1; i<=n; i++) a[(i<<1)-1] = '#', a[i<<1] = s[i];a[(n<<1)+1] = '#';a[0] = '@'; a[(n<<1)+2] = '$';return manacher(a, (n<<1)+1);}
}int main() {freopen("in","r",stdin);scanf("%s", s+1); n = strlen(s+1);fft::ini(n+n+1);for(int i=1; i<=n; i++) a[i].x = s[i]=='a';fft::mul(a);for(int i=1; i<=n+n; i++) f[i] = (int)floor(a[i].x + 0.5);for(int i=0; i<fft::n; i++) a[i] = cd(0, 0);for(int i=1; i<=n; i++) a[i].x = s[i]=='b';fft::mul(a);for(int i=1; i<=n+n; i++) f[i] += (int)floor(a[i].x + 0.5);for(int i=1; i<=n+n; i++) f[i] = (f[i]+1)>>1;//for(int i=1; i<=n+n; i++) printf("f %d  %d\n", i, f[i]);for(int i=1; i<=n+n; i++) mod(ans += Pow(2, f[i]) - 1);//printf("ans1 %lld\n", ans);mod(ans -= ma::cal(s));printf("%lld", ans);
}

转载于:https://www.cnblogs.com/candy99/p/6698576.html

BZOJ 3160: 万径人踪灭 [fft manacher]相关推荐

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

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

  2. BZOJ 3160 FFT+Manacher

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

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

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

  4. Fast Fourier Transform

    写在前面的.. 感觉自己是应该学点新东西了.. 所以就挖个大坑,去学FFT了.. FFT是个啥? 坑已补上.. 推荐去看黑书<算法导论>,讲的很详细 例题选讲 1.UOJ #34. 多项式 ...

  5. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  6. ACM里的生成函数初探

    生成函数 前情提要:由于本人不太喜欢写博客(懒),所以写的时候一般是由于某些原因写的专题内容.这次是2020CCPC长春热身赛的D题没做出来. 大佬论文放前面:推荐阅读:毛杰明 母函数的性质及应用 基 ...

  7. 【BZOJ3160】万径人踪灭 Manacher+FFT

    [BZOJ3160]万径人踪灭 Description Input Output Sample Input Sample Output HINT 题解:自己想出来1A,先撒花~(其实FFT部分挺裸的) ...

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

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

  9. BZOJ.4909.[SDOI2017]龙与地下城(正态分布 中心极限定理 FFT Simpson积分)

    BZOJ 洛谷 [Update 18.11.5] 晚上没事看了看课本,这不(大部分)是数学选修2-3的内容么..也许没有那么...啊? [Update 19.5] 学了学文化课觉得,这tm不就是数学选 ...

  10. bzoj 3513: [MUTC2013]idiots FFT

    bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...

最新文章

  1. linux 脚本向标准输入,linux中的标准输出和输入
  2. datatables中的bug
  3. java - 第一阶段总结
  4. Apache Flink 零基础入门(九)Flink支持哪些数据类型
  5. bootstrap 导航菜单 折叠位置_教大家如何编写一个网页导航条
  6. C#如何反射出委托的签名,如何使用反射调用委托
  7. 团队管理---猴子管理管理法则
  8. centos PIL 安装
  9. 豆瓣上关于一万小时天才理论一书的一个评论
  10. python机器学习库sklearn——岭回归(Ridge、RidgeCV)(L2正则化)
  11. 路由器交换机防火墙无线AP基础理论知识总结
  12. Javascript上传图片转base64并预览
  13. 微信H5分享钉钉分享设置方法
  14. kotlin-stdlib 与 kotlin-stdlib-jdk7
  15. 系列个人网站上线一周年总结
  16. 一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(二)进一步优化,公差分析
  17. Win10更改账户类型为标准改不了怎么办
  18. python 正整数因数分解_python将一个正整数分解质因数.
  19. 各浏览器User-Agent用户代理字符串整理
  20. kaos linux 包管理,KaOS v2018.12版正式发布附下载-独立的 Linux 发行版

热门文章

  1. Java基础总结04-数组
  2. php基本语法(简略篇)
  3. Red Hat 4.4.7 安装 Mysql 5.7
  4. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_10-CMS服务端工程搭建-导入基础工程...
  5. 阶段3 1.Mybatis_02.Mybatis入门案例_1.mybatis的入门
  6. C6748和音频ADC连接时候的TDM以及I2S格式问题
  7. Linux使用pyinstaller 编译py成可执行程序
  8. Android开发1、2周——GeoQuiz项目
  9. 工具-VS插件Resharper快捷键
  10. UVA - 10635 —— Prince and Princess