【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 ...
随机推荐
- easyui DataGrid 的 Checkbox 选择多行
这么一来在取得 DataGrid 的 Checkbox 有勾选的数据值就可以沿用方式一的程序, 1.$('#ButonGetCheck').click(function(){ 2.var checke ...
- SqlSever基础 over与avg配合,将平均值添加到原表的右侧,并为新列起名
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 编写一个Car类,具有final类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。
package b; public class Car { public final static Car pinpai=new Car(); public static Car instance() ...
- 【转载】ODBC, OLEDB, ADO, ADO.Net的演化简史
原文:ODBC, OLEDB, ADO, ADO.Net的演化简史 1.演变历史 它们是按照这个时间先后的顺序逐步出现的,史前->ODBC->OLEDB->ADO->ADO.N ...
- linux 中 ll 命令如何让查询结果按时间升序或降序排序?
-t选项的功能是使输出的结果将以时间降序排列.如果希望按时间的升序排列,可以使用管道符将返回的结果传入tac命令.用法示例:查询当前目录的文件并以降序排列: ll -t查询当前目录的文件并以升序排列: ...
- javascript 中函数eval()
eval()函数可以把一个字符串当作一个JavaScript表达式一样去执行它. 我们常常在Javascript中间到Eval这个函数, 有些人觉得这个函数很奇怪,可以把一些字符串变的功能很强大 在我 ...
- Spring AOP和AspectJ支持
学了Spring之后发现我都不知道java为何物-- 在这一章中有好几节,讲的切面编程 第一节:在项目中启用Spring的AspectJ注解支持 第二节:用AspectJ注解声明aspect 第三节: ...
- Spring MVC 流程图
Spring MVC 流程图 分类: Spring2014-02-23 19:49 9106人阅读 评论(2) 收藏 举报 spring mvc Spring MVC工作流程图 图一 图二 ...
- BDC、CATT批量数据维护
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- servlet&jsp高级:第二部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...