【BZOJ 2803】【POI 2012】Prefixuffix
http://www.lydsy.com/JudgeOnline/problem.php?id=2803
核心思想是利用单调性。
因为长度为L的前缀和后缀循环同构是AB和BA的形式,我们设\(f(i)\)表示A的长度为i时B的最大长度。
有一个比较易证的结论\(f(i-1)\leq f(i)+2\)
但是并不好往这个结论上想。
单哈希被卡了qwq,改成双哈希了。
时间复杂度\(O(n)\)。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int q = 29;
const int q2 = 79;
const int p = 233333333;
const int p2 = 100000007;
const int N = 1000003;
char s[N];
int f[N], powq[N], n, hash[N], r[N], powq2[N], hash2[N];
int get_ha(int l, int r) {
return (hash[r] - 1ll * hash[l - 1] * powq[r - l + 1] % p + p) % p;
}
int get_ha2(int l, int r) {
return (hash2[r] - 1ll * hash2[l - 1] * powq2[r - l + 1] % p2 + p2) % p2;
}
bool check(int l1, int r1, int l2, int r2) {
return get_ha(l1, r1) == get_ha(l2, r2) && get_ha2(l1, r1) == get_ha2(l2, r2);
}
int main() {
scanf("%d", &n);
scanf("%s", s + 1);
for (int i = 1; i <= n; ++i) r[i] = s[i] - 'a' + 1;
powq[0] = powq2[0] = 1;
for (int i = 1; i <= n; ++i) {
powq[i] = 1ll * powq[i - 1] * q % p;
powq2[i] = 1ll * powq2[i - 1] * q2 % p2;
}
hash[0] = hash2[0] = 0;
for (int i = 1; i <= n; ++i) {
hash[i] = (1ll * hash[i - 1] * q % p + r[i]) % p;
hash2[i] = (1ll * hash2[i - 1] * q2 % p2 + r[i]) % p2;
}
int tmpl, tmpr, len = 0;
for (int i = (n >> 1) - 1; i >= 0; --i) {
len += 2; while (i + len > (n >> 1)) --len;
tmpl = i + len; tmpr = n - i - len + 1;
while (len && !check(i + 1, tmpl, tmpr, n - i))
--len, --tmpl, ++tmpr;
f[i] = len;
}
int ans = 0;
tmpl = 0; tmpr = n + 1;
for (int i = 1; i <= (n >> 1); ++i) {
++tmpl; --tmpr;
if (check(1, tmpl, tmpr, n))
ans = max(ans, i + f[i]);
}
printf("%d\n", ans);
return 0;
}
【BZOJ 2803】【POI 2012】Prefixuffix的更多相关文章
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【POI xlsx】使用POI对xlsx的单元格样式进行设置 / 使用POI对xlsx的字体进行设置
涉及到的样式都在代码中有说明: package com.it.poiTest; import java.io.FileNotFoundException; import java.io.FileOut ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】【2084】【POI2010】Antisymmetry
Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...
- 【转】visual studio 2012进行C语言开发[图文]
原文网址:http://blog.csdn.net/chengyafei0104/article/details/9826025 现在大家计算机大概都脱离XP了,so,之前蛮多可以用的编译器,可能放在 ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 企业IT管理员IE11升级指南【11】—— 通过SCCM 2012和WSUS部署Internet Explorer 11
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
随机推荐
- python学习笔记(一)之为什么学习python
python的特点: 跨平台 实现同一个功能是Java代码的1/5 python应用范围: 操作系统 web 3D动画 企业应用 云计算 如何学习python? 学习语法 验证例子 学会总结 课外实践
- WinRAR分割超大文件
在自己的硬盘上有一个比较大的文件,想把它从网上通过E-Mail发送给朋友时,却发现对方的收信服务器不能够支持那么大的文件……,这时即使用ZIP等压缩软件也无济于事,因为该文件本身已经被压缩过了.于是许 ...
- HDU 4757 可持久化trie树
首先如果给定一些数,询问这些数中哪个数^给定的数的值最大的话,我们可以建立一颗trie树,根连接的两条边分别为0,1,表示二进制下第15位,那么我们可以建立一颗trie树,每一条从根到叶子节点的链表示 ...
- C语言分割字符串函数strtok
在编程过程中,有时需要对字符串进行分割.而有效使用这些字符串分隔函数将会给我们带来很多的便利. 下面我将在MSDN中学到的strtok函数做如下翻译. strtok :在一个字符串查找下一个符号 ch ...
- Java 关于微信公众号支付总结附代码
很多朋友第一次做微信支付的时候都有蒙,但当你完整的做一次就会发现其实并没有那么难 业务流程和应用场景官网有详细的说明:https://pay.weixin.qq.com/wiki/doc/api/js ...
- 【EverydaySport】健身笔记——静态牵拉
静态牵拉一般在运动后进行,可以有效的提高肌肉的柔韧性和关节的灵活性,预防和缓解疼痛. 每个动作达到自己活动范围的最大,有牵拉感即说明有效,静态保持至少30秒,切勿震荡,进行2组. 1 大腿前群牵拉 2 ...
- python基础===继承和多继承
继承 class A: def spam(self): print("A.SPAM") def add(self, x,y): return x+y class B(A): def ...
- web.py输出中文字符串乱码问题的解决
web.py中文字符串网页显示乱码的解决 #!/usr/bin/env python # encoding: utf-8 import weburls = ( '/', 'index')class i ...
- 转载: GIt远程操作详解
Git远程操作详解 作者: 阮一峰 日期: 2014年6月12日 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介 ...
- 利用eclipse调试ofbiz之debug使用
1.项目右键-配置debug 2.new一个debug调试 3.配置运行类org.ofbiz.base.start.Start 4.设置内存大小:arguments-VM arguments -Xms ...