\(>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相关推荐

  1. Codeforces 196 E. Tricky and Cleve Password

    \(>Codeforces \space 196\ E. Tricky\ and\ Cleve\ Password<\) 题目大意 : 给出一个有 \(n\) 个结点,\(m\) 条边的连 ...

  2. JavaFX UI控件教程(二十四)之Password Field

    翻译自  Password Field 在本章中,您将了解另一种类型的文本控件,即密码字段. 本PasswordField类实现一个专门的文本字段.通过显示回显字符串来隐藏用户键入的字符.图23-1显 ...

  3. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  4. Spring中配置DataSource数据源的几种选择

    Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...

  5. context.xml mysql_在tomcat下context.xml中配置各种数据库连接池(示例代码)

    Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下.我们可以在这里找到 server.xml 和 context.xml.当然,还有其他一些资源文件.但是在在本文中我们只用得 ...

  6. 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)

    简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -& ...

  7. 程序员必备的20个软件

    此文首发于我的个人博客:windows-程序员必备的20个软件 - zhang0peter的个人博客 我自己基本上每半年左右就要重装一次win10系统,所以我在这么多次的重装系统的过程中总结了如下这些 ...

  8. 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 ...

  9. 基于jquery,bootstrap数据验证插件bootstrapValidator 教程

    ootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.cs ...

最新文章

  1. ioctl kernel 构建注意事项
  2. 【Linux】tcp缓冲区大小的默认值、最大值
  3. c语言 fopen、fwrite、fread、fclose函数(打开文件进行读写覆盖或追加)
  4. mysql 进阶_mysql进阶知识
  5. DRDoS(memcache漏洞导致的反射型分布式拒绝服务攻击)
  6. 【转】如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
  7. OpenCV与图像处理学习三——线段、矩形、圆、椭圆、多边形的绘制以及文字的添加
  8. html window 属性,html中window对象top 、self 、parent 等属性
  9. AEscripts Fog for Mac - 模拟真实三维体薄雾AE/PR插件
  10. 最新版 Enterprise Library 企业库 V4.1 中文学习手册
  11. 设置负数_合同到期提示设置,还在手动计算就out了,学会today函数一键搞定
  12. 两个月新增 80万行代码,Linux 内核维护为什么不会崩?
  13. 海量数据存储的解决方案(分布式数据库)
  14. 点石成金 访客至上的网页设计秘笈 (全一点)
  15. WAP PUSH解析(1)——SMS PDU编码
  16. PIL 库介绍与简单应用
  17. TI CC1310 sub1G的SDK开发之入门
  18. 格物 致知 诚意 正心 修身 齐家 治国 平天下
  19. 22.1.11京东大数据实习面试
  20. 【经典算法】冒泡排序

热门文章

  1. 创客学院知识巩固-04网络
  2. MATLAB画图并将两个图排列在一起
  3. 重来之大学版|卸负篇——破除光环效应,学长学姐、教授老师真的有这么厉害吗?
  4. 商业数据分析师——IT和商业之间的纽带
  5. raise ContentTooShortError(urllib.error.ContentTooShortError: <urlopen error retrieval incomplete:
  6. Astgo(阿斯特)官方提供的使用技巧大全
  7. c语言表达式5278的值是 1 .,c语言表达式5278的值是_____。
  8. Android Audio和耳机,蓝牙耳机等音频外设
  9. 图片转码 webp 转 png、jpg
  10. 新唐M0内核。接口的TTL电平和斯密特电平的使用