【bzoj3160】【xsy1726】万径人踪灭
【bzoj3160】万径人踪灭
题意
给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数。
\(n\leq 100000\)
分析
还是蛮不错的。
这道题基本上是自己想到的。
除了没有利用到'a'和'b'只有两个不同字符的特性。
求不连续回文子序列的个数。
首先问题可以进行转化:
根据容斥原理,用任意回文子序列的个数(1)-连续回文子序列(2)的个数。
问题(2),即连续回文子序列的个数,用Manacher很容易求出来。
所以现在考虑解决问题(1):任意回文子序列的个数。
我们的想法是枚举每条对称轴\(i\),然后考虑对称轴的左右:若该点距离对称轴的距离为\(a\),则\(a\)可以选,当且仅当\(s[i-a]=s[i+a]\)。而两个距离不同的点对的选择互不影响。
所以我们设\(f[i]\)表示以\(i\)为对称轴的可选点对的个数,即\(f[i]=\sum_a [s[i-a]=s[i+a]]\),其中\([a]\)的定义是:若布尔值\(a=true\),则\([a]=1\),否则\([a]=0\)。
由于每个可以选,可以不选,且互不影响,所以答案即是\(\sum_{i为对称轴} 2^{f[i]}\)
关键怎么快速的求\(f[i]\)。
暴力的求法肯定不行,时间复杂度为\(O(n^2)\)。
考虑如何优化求\(f[1],f[2],...,f[n]\)。
还有一个特性没有使用到:就是字符串中的每一个字符只有两种情况:'a','b'。
不妨再分类来想:我们先求出\(s[i-a]=s[i+a]='a'\)的个数,再求出\(s[i-a]=s[i+a]='b'\)的个数,然后相加。
二者问题的形式相同,所以只要能解决\(s[i-a]=s[i+a]='a'\)的个数,另一个问题亦能解决。
注意到,对于一个位置\(i\),对于一个确定的距离\(a\),点对的和为\((i-a)+(i+a)=2i\),即点对的和一定。
所以我们设\(w[i]=[s[i]=='a']\)。
这样,对于一个位置\(i\),若\(i-a\)和\(i+a\)对它有贡献,当且仅当\(w[i-a]*w[i+a]==1\),否则一定没有贡献。
所以我们只需要求第\(2i\)个位置上的值即可。
用FFT即可解决。
上面忽略了一个细节,也是为了行文的流畅性。
就是对称轴可能不在一个字符串上,而可以在两个字符串中间。
如何解决?
只需要把两个字符串中间添加一个虚拟点即可。
小结
(1)计数问题
- 容斥原理(转化手段)
- 枚举(转化手段)
- 排列组合(快速求法)
- 动态规划(分阶段)
【bzoj3160】【xsy1726】万径人踪灭的更多相关文章
- 【BZOJ3160】万径人踪灭(FFT,Manacher)
[BZOJ3160]万径人踪灭(FFT,Manacher) 题面 BZOJ 题解 很容易想到就是满足条件的子序列个数减去回文子串的个数吧... 至于满足条件的子序列 我们可以依次枚举对称轴 如果知道关 ...
- 【BZOJ3160】万径人踪灭 Manacher+FFT
[BZOJ3160]万径人踪灭 Description Input Output Sample Input Sample Output HINT 题解:自己想出来1A,先撒花~(其实FFT部分挺裸的) ...
- 【bzoj3160】 万径人踪灭
http://www.lydsy.com/JudgeOnline/problem.php?id=3160 (题目链接) 题意 给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数. Solu ...
- BZOJ3160【万径人踪灭】 【FFT】
..恩 打了四五遍 不会也背出来了.. BZOJ3160 [听说时限紧?转C++的优势么?] 上AC代码 fft /*Problem: 3160 User: cyz666 Language: C++ ...
- 【bzoj3160】万径人踪灭 FFT
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3160 我是一个傻叉 微笑脸 #include<bits/stdc++.h> #de ...
- 【bzoj3160】万径人踪灭
题意:给一个只含a.b的字符串,求所有的回文不连续子序列. manacher+FFT. 先求出所有回文序列,再减去连续子序列(即回文串). 将a.b分开考虑,对于一个对称轴,以其为回文中心的回文序列的 ...
- Bzoj3160:万径人踪灭
题面 Bzoj Sol 求不连续回文子序列的个数 \(ans=\)回文子序列个数-连续回文子序列个数 即回文子序列个数-回文子串个数 后面直接\(Manacher\)就好了 考虑前面的 枚举对称轴,设 ...
- 【BZOJ3160】 万径人踪灭(FFT,manacher)
前言 多项式真的很难♂啊qwq Solution 考虑求的是一个有间隔的回文串,相当于是: 总的答案-没有间隔的答案 考虑总的答案怎么计算?FFT卷一下就好了. 对于每一位字符,有两种取值,然后随便卷 ...
- 多项式模板&题目整理
注:多项式的题目,数组应开:N的最近2的整数次幂的4倍. 多项式乘法 FFT模板 时间复杂度\(O(n\log n)\). 模板: void FFT(Z *a,int x,int K){ static ...
随机推荐
- okhttp3教程(1)如何引入库
官网: https://github.com/square/okhttp https://github.com/square/okio 1,使用okhttp3需要两个库 在build.gradle c ...
- 【leetcode❤python】 Maximum Depth of Binary Tree
#-*- coding: UTF-8 -*- # Definition for a binary tree node.# class TreeNode(object):# def __init ...
- HDU 5059 Harry And Biological Teacher
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5069 题意:给出n个串,m个询问,每个询问(u,v),求u的一个最长后缀是v的前缀. 思路:离线.将关于u ...
- Java_一些特殊的关键字详(?)解
1. native. 在看JDK源码时,想知道Math包里比如cos, sin等函数是如何实现的(猜想的是用他们在0点的泰勒展开式近似),但是打开之后却发现只有一个函数声明,并且有关键字native, ...
- [转]What you need to know about transimpedance amplifiers – part 1
Transimpedance amplifiers (TIAs) act as front-end amplifiers for optical sensors such as photodiodes ...
- linux挂载共享文件夹
挂载windows共享目录或FTP: 方式一:包含密码 Shell代码 收藏代码 sudo mount //192.168.10.22/FTPServer /windows -o username=u ...
- sql默认启动密码
首先启动sqlplus输入用户名:sqlplus / as sysdba密码空缺如果用户被锁定,记得加上SQL> alter user dbsnmp account unlock; User a ...
- CUBRID学习笔记 14 dll加载错误
这个问题通常是缺少文件cascci.dll 或者版本错误 32 64弄错了 C:\Program Files (x86)\Python266>python.exe Python 2.6.6 (r ...
- Java——FIle:
1.读取文件夹中的文件 /** * 读取图片文件 * @param imgPath 文件所在的文件夹绝对路径 * @return * @throws FileNotFoundException */ ...
- Android学习参考2
一名自学成才的Android开发者怒答! 1. Google做开发前完全是小白,真心不知道有Google这东西,只晓得百 度,遇到问题直接百度,不是黑百度,百度在娱乐八卦方面确实靠谱,但是技术方面查出 ...