【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】万径人踪灭的更多相关文章

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

    [BZOJ3160]万径人踪灭(FFT,Manacher) 题面 BZOJ 题解 很容易想到就是满足条件的子序列个数减去回文子串的个数吧... 至于满足条件的子序列 我们可以依次枚举对称轴 如果知道关 ...

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

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

  3. 【bzoj3160】 万径人踪灭

    http://www.lydsy.com/JudgeOnline/problem.php?id=3160 (题目链接) 题意 给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数. Solu ...

  4. BZOJ3160【万径人踪灭】 【FFT】

    ..恩 打了四五遍 不会也背出来了.. BZOJ3160 [听说时限紧?转C++的优势么?] 上AC代码 fft /*Problem: 3160 User: cyz666 Language: C++ ...

  5. 【bzoj3160】万径人踪灭 FFT

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3160 我是一个傻叉 微笑脸 #include<bits/stdc++.h> #de ...

  6. 【bzoj3160】万径人踪灭

    题意:给一个只含a.b的字符串,求所有的回文不连续子序列. manacher+FFT. 先求出所有回文序列,再减去连续子序列(即回文串). 将a.b分开考虑,对于一个对称轴,以其为回文中心的回文序列的 ...

  7. Bzoj3160:万径人踪灭

    题面 Bzoj Sol 求不连续回文子序列的个数 \(ans=\)回文子序列个数-连续回文子序列个数 即回文子序列个数-回文子串个数 后面直接\(Manacher\)就好了 考虑前面的 枚举对称轴,设 ...

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

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

  9. 多项式模板&题目整理

    注:多项式的题目,数组应开:N的最近2的整数次幂的4倍. 多项式乘法 FFT模板 时间复杂度\(O(n\log n)\). 模板: void FFT(Z *a,int x,int K){ static ...

随机推荐

  1. Json 入门例子【2】

    <script> var json1 = { "id": 1, "tagName": "apple" }; $("#f ...

  2. 未完成的任务之:下载、安装、体验 Gentoo

    Gentoo,伟大的Gentoo是Linux世界最年轻的发行版本,正因为年轻,所以能吸取在她之前的所有发行版本的优点,这也是Gentoo被称为最完美的Linux发行版本的原因之一. 如果你需要一个桌面 ...

  3. VC++ 禁止WebBrowser网页跳转时发出的声音和禁止网页上的文字被选择

    转载:http://blog.csdn.net/cometnet/article/details/51082091 #include <urlmon.h> #ifndef FEATURE_ ...

  4. c++学习之:根据GetLastError()返回值获取错误信息

    VC中GetLastError()获取错误信息的使用在VC中编写应用程序时,经常需要涉及到错误处理问题.许多函数调用只用TRUE和FALSE来表明函数的运行结果.一旦出现错误,MSDN中往往会指出请用 ...

  5. Cheatsheet: 2014 03.01 ~ 03.31

    .NET Should I be concerned about PDB files? async and await -Simplified-Internals Web Performance tr ...

  6. MSChart BarChart

    不让合并0-5 chart1.ChartAreas[].AxisX.LabelStyle.Interval = ; 效果

  7. MSChart使用

    制作报表的时候结果出现画红线处的信息太散, 如果没必要全部显示出来,我们可以使用这种效果: 注意和前面的区分,这个功能叫做Collect Pie Slices(收集分区) 要实现此功能,应先了解相关信 ...

  8. MySQL(六) —— 运算符和函数

    1. 字符函数   函数名称 描述 CONCAT()         字符连接                             CONCAT_WS()          使用指定的分隔符进行字 ...

  9. 用sql的select语句从数据库中获取数据

    基本的select语句 select语句中的算数表达式和NULL值 列的别名 使用连接符操作,literal character strings,alternative quote operator, ...

  10. GenericServlet,HttpServletRequest和HttpServletResponse

    最基本的是通过实现Servlet接口来编写Servlet类,这需要实现Servlet接口中定义的5个方法. 为了简化Servlet的编写,在javax.servlet包中提供了一个抽象类Generic ...