
【算法】Manacher算法
文章平均质量分 87
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【BZOJ3160】万径人踪灭
【题目链接】点击打开链接【思路要点】枚举对称中心,设关于该中心对称点的个数为\(x\),以该点为中心的最长回文子串长度为\(y\),那么该点对答案的贡献应为\(2^x-\lfloor\frac{y+1}{2}\rfloor\)。其中对称点的个数可以通过FFT或bitset压位求出,最长回文子串长度可以用Manacher算法求出。时间复杂度\(O(\frac{N^2}{w})\)或\(O(NLogN...原创 2018-02-26 16:35:18 · 403 阅读 · 0 评论 -
【BZOJ3790】神奇项链
【题目链接】点击打开链接【思路要点】用Manacher算法求出每个字符为中心的极长回文子串,显然,选取更短的回文子串不会使答案更优。因此,问题转化成了“有若干个区间,至少选取多少个才能使它们的并是\([1,N]\)”。用线段树优化DP即可。时间复杂度\(O(NLogN)\)。【代码】#include<bits/stdc++.h>using namespace std; #defin...原创 2018-02-25 14:22:55 · 480 阅读 · 0 评论 -
【BZOJ4755】【JSOI2016】扭动的回文串
【题目链接】点击打开链接【思路要点】一定存在一个最长的扭动回文串是从回文中心所在串的某一个极长回文子串开始,一侧向回文中心所在串匹配,另一侧扭向另一个串匹配。因为任意一个扭动的回文串都对应了一个同样长的满足上述要求的扭动的回文串。枚举回文中心,问题转化为了两个字符串的LCP,字符串哈希和后缀结构均可解决。时间复杂度\(O(NLogN)\)。【代码】#include<bits/stdc++.h...原创 2018-04-10 21:02:55 · 322 阅读 · 0 评论 -
【BZOJ2160】拉拉队排练
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 1000005#define P 19930726long long power(long long x, long long y) { if (y == 0) return 1; long long ...原创 2018-04-03 15:12:58 · 270 阅读 · 0 评论 -
【BZOJ2342】【SHOI2011】双倍回文
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】//PalindromicTree#include<bits/stdc++.h>using namespace std;#define MAXN 500005int n; char s[MAXN];struct Palindromic_Tree { int child[MAXN][26], ans; int f...原创 2018-04-03 18:49:53 · 261 阅读 · 0 评论 -
【BZOJ2084】【POI2010】Antisymmetry
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 500005int len[MAXN], n;char s[MAXN];int main() { scanf("%d\n%s", &n, s + 1); int home = 0, pos =...原创 2018-04-03 20:54:03 · 181 阅读 · 0 评论 -
【BZOJ5036】【JSOI2014】回文串
【题目链接】点击打开链接【思路要点】在每两个字符间插入#(例如:“AAB”\(\Rightarrow\)“#A#A#B#”)。用Manacher算法求出上述字符串每个字符为中心的最长回文子串的长度\(l_i\)。记\(len_i=\frac{l_i+1}{2}\),不难发现\(len_i\)即为只算一边的字符时最长回文子串的长度,也即回文串的个数。现在考虑每一个询问\([L,R]\),我们将其变为...原创 2018-04-24 21:09:53 · 411 阅读 · 0 评论