[JSOI2019]节日庆典(Z-algorithm)
要想让一个位置作为最小循环,其必须是最小后缀,然后一个字符串的最小后缀不超过O(logn)个,于是维护备选集合即可。
然而要在O(n)复杂度求解,需要求出原串后缀与原串的LCP长度,需要用Z-algorithm。而此时由于备选后缀存在前缀关系,比较时只需用到每个后缀与原串的LCP
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+;
int n,ans,lcp[N];
char str[N];
vector<int>f,g;
int cmp(int x,int len)
{
if(lcp[x]>=len)return ;
return str[+lcp[x]]<str[x+lcp[x]]?:-;
}
int main()
{
scanf("%s",str+),n=strlen(str+);
for(int i=,l=,r=;i<=n;i++)
{
lcp[i]=r>=i?min(lcp[i-l+],r-i+):;
while(str[i+lcp[i]]==str[+lcp[i]])lcp[i]++;
if(i+lcp[i]->r)r=i+lcp[i]-,l=i;
}
for(int i=;i<=n;i++)
{
g.clear(),f.push_back(i);
for(int j=;j<f.size();j++)
{
while(g.size()&&str[i]<str[g.back()+i-f[j]])g.pop_back();
if(!g.size()||str[i]==str[g.back()+i-f[j]]&&i-g.back()+>=*(i-f[j]+))
g.push_back(f[j]);
}
f=g;
ans=f[];
for(int j=;j<f.size();j++)
{
int y=f[j],t=cmp(ans+i-y+,y-ans);
if(t==)ans=y;
else if(!t&&cmp(y-ans+,ans-)==-)ans=y;
}
printf("%d ",ans);
}
}
[JSOI2019]节日庆典(Z-algorithm)的更多相关文章
- [JSOI2019]节日庆典 做题心得
[JSOI2019]节日庆典 做题心得 一个性质有趣的字符串题 这要是在考场上我肯定做不出来吧 一开始还以为要 SAM 什么的暴力搞,没想到只用到了 \(Z\) 函数 -- 也是我生疏了罢 (学了啥忘 ...
- 【LOJ】#3103. 「JSOI2019」节日庆典
LOJ#3103. 「JSOI2019」节日庆典 能当最小位置的值一定是一个最小后缀,而有用的最小后缀不超过\(\log n\)个 为什么不超过\(\log n\)个,看了一下zsy的博客.. 假如\ ...
- LOJ #3103. 「JSOI2019」节日庆典
题意 给定字符串 \(S\) ,对于 \(S\) 的每个前缀 \(T\) 求 \(T\) 所有循环同构串的字典序最小的串,输出其起始下标.(如有多个输出最靠前的) \(|S| \le 3 \times ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- ExKMP(Z Algorithm) 讲解
目录 问题引入 CaiOJ 1461 [EXKMP]最长共同前缀长度 算法讲解 匹配过程 next 的求解 复杂度证明 代码解决 一些例题 UOJ #5. [NOI2014]动物园 CF1051E V ...
- Lyndon 相关的炫酷字符串科技
浅谈从 Lyndon Words 到 Three Squares Lemma By zghtyarecrenj 本文包括:Lyndon Words & Significant Suffixes ...
- hs-black 杂题选讲
[POI2011]OKR-Periodicity 考虑递归地构造,设 \(\text{solve(s)}\) 表示字典序最小的,\(\text{border}\) 集合和 \(S\) 的 \(\tex ...
- Lydon 分解与最小表示法
我们定义一个串是 \(\text{Lyndon}\) 串,当且仅当这个串的最小后缀就是这个串本身. 该命题等价于这个串是它的所有循环表示中字典序最小的. 引理 1:如果 \(u\) 和 \(v\) 都 ...
- JSOI2019 Round2
JSOI的题质量很高-- 精准预测(2-SAT.拓扑排序.bitset) 不难发现两个条件都可以用经典的2-SAT连边方式连边,考虑如何加入时间的限制.对于第\(x\)个人在\(t\)时刻的状态是生/ ...
随机推荐
- 吴裕雄--天生自然C++语言学习笔记:C++ 存储类
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C++ 程序中可用的存储类: auto register static extern m ...
- cf1200 E Compress Words(哈希)
题意 有n个字符串,记为s1,s2……sn,s2与s1合并,合并的方式为:s1的后缀若与s2的前缀相同,就可以重叠起来,要最长的. 举个例子: “1333” “33345” → “133345” s ...
- Git--git log
参考 https://www.cnblogs.com/bellkosmos/p/5923439.html https://www.cnblogs.com/mkl34367803/p/9219913.h ...
- 19 01 08 javascript 初学
变量 JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定. 定义变量需要用关键字 'var' 变量类型 5种基本数据类型:1.number 数字类型2.string ...
- SpringCloud学习之手把手教你用IDEA搭建入门项目(一)
SpringCloud简单搭建 jdk:1.8开发工具:IDEA注:需要了解springcloud 1.创建最简单的Maven项目 1)开始创建一个新的项目 2)创建一个空模板的maven项目,用 ...
- MySQL实现免密登录和数据库无法启动问题
1. 进入MySQL安装的文件夹,打开my.ini配置文件,打开方式参考:https://www.cnblogs.com/leslie12956/p/11842956.html 2. 停止MysSQL ...
- P(Y=y|x;θ)表示什么意思
https://blog.csdn.net/jh1137921986/article/details/88999539 在机器学习中,特别是学习到关于概率/似然估计方面的内容,经常看到类似P(Y=y| ...
- alert(1&&2)的输出问题
此文章转载自http://blog.csdn.net/xiaotao_css/article/details/61940664 一.先来说说 ||(逻辑或),从字面上来说,只有前后都是false的时候 ...
- 【PS学习成果】手持雷电
结合网上的教程和素材,试试水. 备注申明:图片和教程 均来自网络PS家园网(www.psjia.com),如有侵权,请联系本人,马上删除.
- python 2.7编译安装
一 官网下载python2.7源码: python安装pip python -m ensurepip --default-pip