博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2342
阅读量:5231 次
发布时间:2019-06-14

本文共 1470 字,大约阅读时间需要 4 分钟。

manacher+set

好像这种求回文串形态的都是用manacher,然后求出中心之间奇怪的关系

我们先跑出来manacher,由于只要偶数回文串,我们就只把#位置记录下来,重新保存,然后我们考虑什么情况下区间[x+1,y]*4可以更新答案,x是整个回文串的中心。那么很明显有x+f[x]/2>=y,y-p[y]>=x

碰见这种情况,我们一般先保证一个不等式恒成立,另一个用数据结构搞一搞,那么我们让y-p[y]>=x恒成立,先对y排个序,然后将满足条件的y逐渐加入,插入set,我们枚举的是x,自然希望y越大越好,那么我们在set里查x+f[x]/2的前继,看能是否更新答案。

#include
using namespace std;const int N = 500010;int n, len, ans, pos, mx;char t[N], s[N << 1];int p[N << 1], f[N], y[N];set
S;bool cmp(int i, int j) { return i - f[i] < j - f[j]; }int main(){ scanf("%d%s", &n, t + 1); s[0] = '!'; s[len = 1] = '#'; for(int i = 1; i <= n; ++i) s[++len] = t[i], s[++len] = '#'; for(int i = 1; i <= len; ++i) { if(i < mx) p[i] = min(mx - i, p[2 * pos - i]); else p[i] = 1; while(s[i - p[i]] == s[i + p[i]]) ++p[i]; if(i + p[i] > mx) { pos = i; mx = i + p[i]; } } for(int i = 1; i <= n; ++i) f[i] = (p[i << 1 | 1] - 1) >> 1, y[i] = i; sort(y + 1, y + n + 1, cmp); int j = 0; for(int i = 1; i <= n; ++i) { while(y[j + 1] - f[y[j + 1]] <= i && j < n) ++j, S.insert(y[j]); set
:: iterator it = S.upper_bound(i + (f[i] >> 1)); if(it == S.begin()) continue; else --it; if(i + (f[i] >> 1) >= *it && *it - f[*it] <= i) ans = max(ans, (*it - i) * 4); } printf("%d\n", ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/19992147orz/p/7552497.html

你可能感兴趣的文章
Echarts-地图扩展-标准geoJson格式扩展地图-例子
查看>>
python之函数
查看>>
猫与老鼠的故事(委托)
查看>>
探讨企业管理软件平台架构(转)
查看>>
php设计模式--单例模式
查看>>
Web请求过程
查看>>
面向对象的设计模式
查看>>
python第二十九课——文件读写(读取读取中文字符)
查看>>
forEach遍历Ajax Json数据
查看>>
《Linux/Unix系统编程手册》 时间子系统
查看>>
【翻译】Ext JS最新技巧
查看>>
E - Let's Go Rolling!
查看>>
二十进制数的加法
查看>>
python string module
查看>>
Matlab中psf2otf()函数在opencv中的实现
查看>>
HTML 基础
查看>>
工作笔记 之 Linux服务搭建
查看>>
springMVC+uploadify3.1 文件上传 demo
查看>>
Wince下实现ImageButton
查看>>
*92. Reverse Linked List II (follow up questions)
查看>>