[POI2012] PRE-Prefixuffix 题解
前言
题目链接:洛谷。
题意简述
给出长为 \(n\) 的串 \(\texttt{S}\)。求最大的 \(l\) 满足:
\]
其中 \(\doteq\) 表示循环相同。
题目分析
看到循环相同,套路化想到,两个字符串一定可以表示成 \(\texttt{AB}\) 和 \(\texttt{BA}\) 的形式。那么 \(\texttt{S}\) 就能表示成 \(\texttt{ABTBA}\)。那么可以枚举两侧的 \(\texttt{A}\),接下来问题变成了求 \(\texttt{S}\) 扣掉两侧的 border。
求 border,想到每次线性跑一遍 KMP,但是这样是 \(\Theta(n^2)\),能够得到 \(50 \%\) 的部分分。考虑优化。
发现 \(i \sim n - i + 1\) 的 border 和 \(i - 1 \sim n - i\) 的 border 在某些情况下有很大一部分是重合的。进一步发现,从前者到后者,border 最多增加 \(2\),如图。
淡蓝色的是 \(i \sim n - i + 1\) 的 border,\(i - 1 \sim n - i\) 的 border 在此基础上多了红色和绿色部分。
所以考虑递推。记 \(f_i\) 表示 \(\texttt{S}\) 删去前 \(i\) 个和后 \(i\) 个字符的 border。边界 \(f_{\Big \lfloor \cfrac{n}{2} \Big \rfloor + 1} = 0\)。每次 \(f_i\) 初始值设置成 \(f_{i + 1} + 2\),当然需要和 \(\Big \lfloor \cfrac{n}{2} \Big \rfloor - i\) 取个 \(\min\)。然后一直让 \(f_i \gets f_i - 1\),直到满足找到一个长为 \(f_i\) 的 border,这样显然是最优的。
至于判断是否为 border,使用哈希即可。
时间复杂度的话,把 \(f\) 看成不断 \(+2\) 和 \(-1\),前者次数不会超过 \(\Big \lfloor \cfrac{n}{2} \Big \rfloor\),所以是 \(\Theta(n)\) 的。
代码
// #pragma GCC optimize(3)
// #pragma GCC optimize("Ofast", "inline", "-ffast-math")
// #pragma GCC target("avx", "sse2", "sse3", "sse4", "mmx")
#include <iostream>
#include <cstdio>
#define debug(a) cerr << "Line: " << __LINE__ << " " << #a << endl
#define print(a) cerr << #a << "=" << (a) << endl
#define file(a) freopen(#a".in", "r", stdin), freopen(#a".out", "w", stdout)
#define main Main(); signed main() { return ios::sync_with_stdio(0), cin.tie(0), Main(); } signed Main
using namespace std;
const int mod = 1314736520;
const int bas = 131;
inline int add(int a, int b) {
return a + b >= mod ? a + b - mod : a + b;
}
inline int sub(int a, int b) {
return a - b < 0 ? a - b + mod : a - b;
}
inline int mul(int a, int b) {
return 1ll * a * b % mod;
}
int n, hsh[1000010], pw[1000010];
char str[1000010];
int f[1000010], ans;
inline int gethash(int l, int r) {
return l > r ? 0 : sub(hsh[r], mul(hsh[l - 1], pw[r - l + 1]));
}
signed main() {
scanf("%d%s", &n, str + 1), pw[0] = 1;
for (int i = 1; i <= n; ++i) {
hsh[i] = add(mul(hsh[i - 1], bas), str[i]);
pw[i] = mul(pw[i - 1], bas);
}
for (int i = n / 2; i >= 1; --i) {
int res = min(f[i + 1] + 2, n / 2 - i);
while (res >= 1 && gethash(i + 1, i + res) != gethash(n - i - res + 1, n - i))
--res;
f[i] = res;
}
for (int i = 1; i <= n / 2; ++i)
if (gethash(1, i) == gethash(n - i + 1, n))
ans = max(ans, i + f[i]);
printf("%d\n", ans);
return 0;
}
[POI2012] PRE-Prefixuffix 题解的更多相关文章
- POI2012题解
POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
- 【BZOJ2803】[Poi2012]Prefixuffix 结论题
[BZOJ2803][Poi2012]Prefixuffix Description 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串 ...
- [BZOJ2803][Poi2012]Prefixuffix
2803: [Poi2012]Prefixuffix Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 219 Solved: 95[Submit][St ...
- bzoj 2803 [Poi2012]Prefixuffix 兼字符串hash入门
打cf的时候遇到的问题,clairs告诉我这是POI2012 的原题..原谅我菜没写过..于是拐过来写这道题并且学了下string hash. 字符串hash基于Rabin-Karp算法,并且对于 ...
- [Poi2012]Festival 题解
[Poi2012]Festival 时间限制: 1 Sec 内存限制: 64 MB 题目描述 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1. 给出a,b (1 ...
- 题解:POI2012 Salaries
题解:POI2012 Salaries Description The Byteotian Software Corporation (BSC) has \(n\) employees. In BSC ...
- BZOJ2803[Poi2012]Prefixuffix——hash
题目描述 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的.给出一个长度为n的串S,求满足下面条件的最大的L: ...
- 【题解】 [POI2012]FES-Festival (差分约束)
懒得复制题面,戳我戳我 Question: (因为网上找不到好的翻译,这里简单复述一下) 告诉你\(m1+m2\)个约束条件,然后要你找出\(X_1-X_n\)这些数字,求满足要求的数列中不同的数字个 ...
- bzoj 2803 [POI2012]prefixuffix hsh+性质
题目大意 bzoj 2803 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的. 给出一个长度为n的串S,求满 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
随机推荐
- elasticsearch6.8 ik分词器需安装
elasticsearch6.8 ik分词器需安装order_info_es/_analyze POST{ "analyzer": "ik_max_word" ...
- MinIO 图片转文件的分界线RELEASE.2022-05-26T05-48-41Z
前言:本人想用MinIO存储文件,但是不想最新版本Mete文件,于是各种寻找于是终于找到办法了,原来是官方版本更新导致的.需要我们去寻找相应的版本. 1.官网下载网站 https://dl.min.i ...
- 基于Vue+OpenSeaDragon的数字细胞阅片开发
前端框架: vue+elementui+openseadragon 后端 .net core 5.0 数据库 mysql 目前项目效果如图 在原有的基础上新增了阅片轨迹 图像调节,绘图,截图等功能. ...
- 推荐一个vs Nuget部署插件
写在前面 nuget部署工具, 无论是直接用web上传还是用命令行工具上传,还是其他第三方工具我都没找到满意,直到那天在群里提了一下,有位大佬说了个NuPackvs插件,用了下,感觉基本满足了我的需求 ...
- Vite-Wechat网页聊天室|vite5.x+vue3+pinia+element-plus仿微信客户端
基于Vue3+Pinia+ElementPlus仿微信网页聊天模板Vite5-Vue3-Wechat. vite-wechat使用最新前端技术vite5+vue3+vue-router@4+pinia ...
- JS神奇的或0(|0)
按照常识,位运算x|0,要么等于x,要么等于0 那么在JS的世界你的认知就要被颠覆了 下面请看 不带或0运算: (window.crypto.getRandomValues(new Uint32Arr ...
- Linux驱动:使用workqueue、tasklet处理中断
Linux驱动:使用workqueue.tasklet处理中断 背景 中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化.但是,中断是一个随机事件,它随时会到来,如果关中断 ...
- Linux内核的5个子系统
--- title: Linux内核的5个子系统 EntryName: subsystems_in_linux_kernel date: 2020-10-10 03:07:07 categories: ...
- JVM(Java虚拟机) 整理(一):基础理论
JVM整体结构 本文主要说的是HotSpot虚拟机, JVM 全称是 Java Virtual Machine,中文译名:Java虚拟机 简化一下: Java字节码文件 Class文件本质上是一个以8 ...
- debian12 创建本地harbor镜像库
前言 harbor是一个docker/podman镜像管理库,可用于存储私人镜像.现将本人在debian12系统搭建harbor镜像库的过程记录下来,留作后续参考. 可以参考github harbor ...