[JSOI2019]节日庆典(Z-algorithm)
2024-09-04 02:00:31
要想让一个位置作为最小循环,其必须是最小后缀,然后一个字符串的最小后缀不超过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);
}
}
最新文章
- MySQL调优系列_日志分析
- 一则因为numa引发的mysqldump hang住
- nginx下目录浏览及其验证功能配置记录
- TclError: no display name and no $DISPLAY environment variable
- 启动图实现:UIScrollView+UIPageControl简单实现
- paper 22:kl-divergence(KL散度)实现代码
- 全半角空格导致的Sql Server Analysis Services处理错误(转载)
- uva 11181
- -_-#【JS】隐含全局变量
- HDU 5793 - A Boring Question
- sqlmap新手注入
- Thread.join()分析方法
- python基础-------模块与包(一)
- python format() 函数
- sqlserver 中通配符%和_的使用
- 堆的操作(make_heap,push_heap,pop_heap,sort_heap,is_heap)
- 解决Win10家庭版没有‘本地用户和组’问题
- SQL随机生成6位数字
- 制作系统U盘,不用做任何动作直接从U盘启动装系统(非PE的)
- Flask初级(二)为flash创建路由,访问路径。