manacher
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
hdu3068 最长回文(manacher)
求最长回文子串,manacher模板题。就是充分利用已知信息,尽量减少冗余操作。因为mx是始终右移的,所以是O(n)的。#include #include #define N 110010char s[N<<1],str[N];int n,p[N<<1];//p[i]表示以s[i]为中心向一边延伸的最长长度(含i)//即s[i-p[i]+1]...s[i]=s[i]..s[i+p[i原创 2017-07-26 17:14:17 · 308 阅读 · 0 评论 -
luogu3805【模板】manacher算法
敲敲敲,敲板子。原创 2018-04-28 15:20:04 · 209 阅读 · 0 评论 -
bzoj3160 万径人踪灭(manacher+fft)
要求不连续的回文子序列个数。我们考虑用所有的回文子序列个数-连续的回文子序列个数。连续的回文子序列个数就是回文子串的个数,我们可以用manacher来求。考虑如何求回文子序列的总数。我们先都按manacher那样插入若干’#’以后,处理出一个f[i]数组,表示i两侧对称的字母对数。(含自己,不含#)。则总数就是∑i=22n2f[i]−1\sum\limits_{i=2}^{2n}2^{f[i]}-1原创 2018-03-15 22:58:43 · 336 阅读 · 0 评论 -
bzoj3790 神奇项链(manacher+贪心)
我们用manacher处理出所有的回文串。由于机器二的特殊性质,我们发现,其实如果我们把以每一个字符为中心的最长回文串看做一条线段的话,就是问你最少需要几条线段覆盖1~n。这个问题我们可以贪心的解决。把所有线段按左端点从小到大排序,每次选一条能接上的且能延伸最远的即可。最后答案就是所需最少线段数-1.原创 2018-02-22 17:29:12 · 506 阅读 · 0 评论 -
bzoj1414 [ZJOI2009]对称的正方形(二分答案+二维哈希)
首先我们考虑偶数个点和奇数个点的方阵枚举中心方式不太相同,我们用类似manacher的处理方法,填上一堆0,把他们全都变成奇数的情况。然后我们枚举每一个点作为中心,二分答案找到以这个点为中心最大的合法方阵。就可以直接统计这个点对答案的贡献了。这样已经是O(n2logn)O(n^2logn)的了,我们需要O(1)判断一个方阵是否上下左右均对称。类似不用manacher求最长回文子串的方法,把这个子串镜原创 2018-01-16 17:16:56 · 549 阅读 · 0 评论 -
bzoj3676 [Apio2014]回文串(manacher+SA+二分+lcp)
manacher板子戳这里 我们用manacher枚举回文串,用SA求这个串的出现次数。(利用h数组二分求最大包含区间[l…r],则出现次数为r-l+1)类似这道题。不错的好题。。。原创 2017-08-26 15:58:09 · 325 阅读 · 0 评论 -
bzoj2342 [Shoi2011]双倍回文(manacher+暴力/set)
题意:求一个最长的回文串,满足它的后半段也是个偶数回文串。 首先用manacher处理出f数组,表示以i,i+1为对称轴的最长偶数回文的长度的一半(根据题目不难发现只有偶数回文才有用)(造样例推一推和p数组的关系)。然后枚举以x,x+1为对称轴的双倍回文,检验是否存在(枚举y,看以y,y+1为对称轴且过x+1点的回文是否存在 ,显然y最大到x+f[x]/2,最小到x+1)原创 2017-07-28 21:21:35 · 377 阅读 · 0 评论 -
poj3974 Palindrome(manacher)
一把好水???原创 2017-07-28 22:30:07 · 347 阅读 · 0 评论 -
hdu4513 (manacher)
题意:求最长回文子串,且从最左到mid是单调不降的。基本同manacher板子,就加了一个条件:s[i+p[i]]#include #include #define N 100010inline int read(){ int x=0,f=1;char ch=getchar(); while(ch'9'){if(ch=='-') f=-1;ch=getchar();} wh原创 2017-07-26 21:14:47 · 456 阅读 · 0 评论 -
hdu3294 Girls' research(manacher)
manacher模板吧。。就多了个翻译一下输出串。#include #include #define N 200010char op[1],str[N],s[N<<1];int p[N<<1],n;inline int min(int x,int y){return x<y?x:y;}int main(){// freopen("a.in","r",stdin); wh原创 2017-07-26 18:00:06 · 310 阅读 · 0 评论 -
bzoj3676 [Apio2014]回文串(manacher+SAM)
首先对原串建SAM,并处理出每个点所代表的串出现的次数sz。 用manacher搞出本质不同的回文子串,去SAM上查询出现次数即可。 在SAM上定位这个串的时候倍增查找即可。 复杂度O(nlogn)O(nlogn)O(nlogn) 注意我这样manacher没有处理单点的情况…#include <bits/stdc++.h>using namespace std;#de...原创 2018-06-22 15:39:56 · 284 阅读 · 0 评论