Codeforces 30 E. Tricky and Cleve Password
\(>Codeforces \space 30\ E. Tricky\ and\ Cleve\ Password<\)
题目大意 : 给出一个串 \(S\),让你找出 \(A, B, C\) 三个串,满足 \(C\) 是一个后缀, \(A + B + C\)是一个回文串,\(B\) 是一个长度为奇数的回文串,且 \(A, C\) 可以为空,并最大化 \(|A| + |B| + |C|\)
\(1 \leq |S| \leq 10^5\)
解题思路 :
考虑 \(B\) 是不能为空的,不妨先用 \(Manacher\) 跑一边,然后枚举 \(B\) 的回文中心
那么问题转化为,在 \(B\) 之前的某个子串和在 \(B\) 之后的后缀的反串最长匹配长度
可以 \(KMP\) 出对于每一个 \(i\),\(mx_i\) 表示以 \(i\) 结尾的前缀最长匹配了多长的反串后缀
那么对于回文中心 \(i\), 设其回文半径为 \(r_i\),其作为 \(B\) 串回文中心的答案就是 \(2(p_i+\min(mt[i-r_i], n - i - r_i + 1) - 1\)
所以统计枚举每一个回文中心,\(O(1)\) 统计答案即可,总复杂度是 \(O(n)\),更多内容可以参考 2014年集训队论文 《浅谈回文子串问题 》—— 徐毅
/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){int f = 0, ch = 0; x = 0;for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;if(f) x = -x;
}const int N = 500005;
char s[N];
int pr[N], n;
struct Match{ int l, r, len; } mt[N];
struct Answer{ int l, r, p, su, val; } ans;namespace Manacher{char t[N]; int r[N], len;inline void init(char *s){for(int i = 1; i <= n; i++) t[++len] = '#', t[++len] = s[i]; t[++len] = '#';}inline void realmain(){int mx = 0, p = 0;for(int i = 1; i <= len; i++){if(mx > i) r[i] = Min(r[2*p-i], mx - i); else r[i] = 1;while(r[i] < i && i + r[i] - 1 <= len && t[i-r[i]] == t[i+r[i]]) ++r[i];if(i + r[i] - 1 > mx) mx = i + r[i] - 1, p = i;}for(int i = 2; i <= len; i += 2) pr[i/2] = r[i] / 2;}
}
namespace Kmp{char t[N]; int nxt[N];inline void init(char *s){for(int i = 1; i <= n; i++) t[i] = s[n-i+1];nxt[0] = -1;for(int i = 1, j = -1; i <= n; nxt[i++] = ++j)while(t[j+1] != t[i] && ~j) j = nxt[j];}inline void realmain(char *s){for(int i = 1, j = 0; i <= n; i++){while(t[j+1] != s[i] && ~j) j = nxt[j];mt[i].len = ++j, mt[i].r = i, mt[i].l = i - j + 1;}for(int i = 1; i <= n; i++) if(mt[i-1].len > mt[i].len) mt[i] = mt[i-1];}
}
int main(){scanf("%s", s + 1), n = strlen(s + 1);Kmp::init(s), Kmp::realmain(s);Manacher::init(s), Manacher::realmain();for(int i = 1; i <= n; i++){int pos = i - pr[i], suf = min(mt[pos].len, n - i - pr[i] + 1);int res = 2 * (pr[i] + suf) - 1;if(res > ans.val) ans = (Answer){mt[pos].l, mt[pos].r, i, suf, res}; }int l1 = ans.l, r1 = ans.r;int l2 = ans.p - pr[ans.p] + 1, r2 = ans.p + pr[ans.p] - 1;int l3 = n - ans.su + 1, r3 = n, tot = 3;r1 = min(r1, l2 - 1), l3 = max(l3, r2 + 1);if(r1 < l1 || !l1 || !r1) tot--;if(l3 > r3 || l3 > n || r3 > n) tot--;cout << tot << endl;if(l1 <= r1 && l1 && r1) cout << l1 << " " << r1 - l1 + 1 << endl;cout << l2 << " " << r2 - l2 + 1 << endl;if(l3 <= r3 && l3 <= n && r3 <= n) cout << l3 << " " << r3 - l3 + 1 << endl;return 0;
}
转载于:https://www.cnblogs.com/mangoyang/p/9401956.html
Codeforces 30 E. Tricky and Cleve Password相关推荐
- Codeforces 196 E. Tricky and Cleve Password
\(>Codeforces \space 196\ E. Tricky\ and\ Cleve\ Password<\) 题目大意 : 给出一个有 \(n\) 个结点,\(m\) 条边的连 ...
- JavaFX UI控件教程(二十四)之Password Field
翻译自 Password Field 在本章中,您将了解另一种类型的文本控件,即密码字段. 本PasswordField类实现一个专门的文本字段.通过显示回显字符串来隐藏用户键入的字符.图23-1显 ...
- Java EE学习心得
–Java EE学习心得 1. 称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...
- Spring中配置DataSource数据源的几种选择
Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...
- context.xml mysql_在tomcat下context.xml中配置各种数据库连接池(示例代码)
Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下.我们可以在这里找到 server.xml 和 context.xml.当然,还有其他一些资源文件.但是在在本文中我们只用得 ...
- 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)
简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -& ...
- 程序员必备的20个软件
此文首发于我的个人博客:windows-程序员必备的20个软件 - zhang0peter的个人博客 我自己基本上每半年左右就要重装一次win10系统,所以我在这么多次的重装系统的过程中总结了如下这些 ...
- mysql jdbc tomcat_Tomcat+MySql+jdbc
Tomcat+MySql+jdbc Linux下安装配置 Jdk+Tomcat+MySql+jdbc 1.安装JDK 下载 jdk-7-linux-i586.rpm http://java.sun.c ...
- 基于jquery,bootstrap数据验证插件bootstrapValidator 教程
ootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.cs ...
最新文章
- ioctl kernel 构建注意事项
- 【Linux】tcp缓冲区大小的默认值、最大值
- c语言 fopen、fwrite、fread、fclose函数(打开文件进行读写覆盖或追加)
- mysql 进阶_mysql进阶知识
- DRDoS(memcache漏洞导致的反射型分布式拒绝服务攻击)
- 【转】如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
- OpenCV与图像处理学习三——线段、矩形、圆、椭圆、多边形的绘制以及文字的添加
- html window 属性,html中window对象top 、self 、parent 等属性
- AEscripts Fog for Mac - 模拟真实三维体薄雾AE/PR插件
- 最新版 Enterprise Library 企业库 V4.1 中文学习手册
- 设置负数_合同到期提示设置,还在手动计算就out了,学会today函数一键搞定
- 两个月新增 80万行代码,Linux 内核维护为什么不会崩?
- 海量数据存储的解决方案(分布式数据库)
- 点石成金 访客至上的网页设计秘笈 (全一点)
- WAP PUSH解析(1)——SMS PDU编码
- PIL 库介绍与简单应用
- TI CC1310 sub1G的SDK开发之入门
- 格物 致知 诚意 正心 修身 齐家 治国 平天下
- 22.1.11京东大数据实习面试
- 【经典算法】冒泡排序
热门文章
- 创客学院知识巩固-04网络
- MATLAB画图并将两个图排列在一起
- 重来之大学版|卸负篇——破除光环效应,学长学姐、教授老师真的有这么厉害吗?
- 商业数据分析师——IT和商业之间的纽带
- raise ContentTooShortError(urllib.error.ContentTooShortError: <urlopen error retrieval incomplete:
- Astgo(阿斯特)官方提供的使用技巧大全
- c语言表达式5278的值是 1 .,c语言表达式5278的值是_____。
- Android Audio和耳机,蓝牙耳机等音频外设
- 图片转码 webp 转 png、jpg
- 新唐M0内核。接口的TTL电平和斯密特电平的使用