要想让一个位置作为最小循环,其必须是最小后缀,然后一个字符串的最小后缀不超过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);
}
}

最新文章

  1. MySQL调优系列_日志分析
  2. 一则因为numa引发的mysqldump hang住
  3. nginx下目录浏览及其验证功能配置记录
  4. TclError: no display name and no $DISPLAY environment variable
  5. 启动图实现:UIScrollView+UIPageControl简单实现
  6. paper 22:kl-divergence(KL散度)实现代码
  7. 全半角空格导致的Sql Server Analysis Services处理错误(转载)
  8. uva 11181
  9. -_-#【JS】隐含全局变量
  10. HDU 5793 - A Boring Question
  11. sqlmap新手注入
  12. Thread.join()分析方法
  13. python基础-------模块与包(一)
  14. python format() 函数
  15. sqlserver 中通配符%和_的使用
  16. 堆的操作(make_heap,push_heap,pop_heap,sort_heap,is_heap)
  17. 解决Win10家庭版没有‘本地用户和组’问题
  18. SQL随机生成6位数字
  19. 制作系统U盘,不用做任何动作直接从U盘启动装系统(非PE的)
  20. Flask初级(二)为flash创建路由,访问路径。

热门文章

  1. 字符串专题之KMP算法
  2. idea排除要编译的文件
  3. trove module使用说明
  4. 19 01 04 CSS3 圆角 grba(带通明的) tansition动画 transform变换 animation动画
  5. 18 12 4 SQL 的基本 语法
  6. dp--P1439 最长公共子序列(LCS)
  7. addlayer添加神经网络层
  8. UML-用例关联
  9. Python 重新加载模块
  10. Codeforces Round #571 (Unrated for Div. 1+Div. 2)