【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 ...
 
随机推荐
- java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
			
今天用maven编写Selenium测试程序时,调用 HtmlUnitDriver driver = new HtmlUnitDriver(true); 反法时报错如下: java.lang.NoCl ...
 - JLINK使用教程详解,以及与JTAG区别
			
对于一个新手来说,一切都不容易. 而从头学起也是一件非常美好的事. 观看 调试ARM,要遵循ARM的调试接口协议,JTAG就是其中的一种.当仿真时,IAR.KEIL.ADS等都有一个公共的调试 ...
 - xshell无法连接centos 6.6的问题
			
最近在做MySQL集群配置的预研工作,需要在VirtualBox上安装CentOS 6.6.参照网上的教程安装好centos后,出现了一个问题:虚拟机外部的文本内容无法复制粘贴到CentOS的终端里去 ...
 - null&this&super&向上转型
			
向上转型:父类声明子类实例化对象 例如A是父类 B是子类 1 : 实际上是父类的对象但将会丢失子类没有的父类方法 ,如果调用方法 将会调用子类重写的父类方法 2:上转型对象不能调用子类新增 ...
 - TC SRM633
			
第三题:n个数字,有m个限制,每个限制给出某两个数字的Gcd或者Lcm为多少.最后问这样的n个数存在否. 思路:我们发现,对于素数p1,p2,n个数中每个数含有多少个p1,p2是没有联系的,因此每个素 ...
 - BZOJ 1565 植物大战僵尸(最大权闭合图)
			
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1565 题意:植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: ...
 - img 图片高度设置为百分比无效的解答
			
当用百分比作为宽高时 因为百分比是相对于其最近的父元素的宽高,所以首先其父元素要有宽高,宽度一般不设置会有默认值(比如整个屏幕的宽度),但是高度不设置就没有默认值,因此如果父元素没设高度值,而其内部 ...
 - EF实体框架常见问题
			
1,无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServ ...
 - LINQ 如何实现 in 与 not in
			
T-SQL的IN: Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID , ) T-SQL的NOT ...
 - JMS【四】--Spring和ActiveMQ整合的完整实例
			
第一篇博文JMS[一]--JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文JMS[二 ...