最小表示法模板(洛谷P1368 工艺)(最小表示法)

洛谷题目传送门

最小表示是指一个字符串通过循环位移变换(第一个移到最后一个)所能得到的字典序最小的字符串。

因为是环状的,所以肯定要先转化为序列,把原串倍长。

设决策点为一个表示法的开头。比较两个决策点i,j,找到它们的LCP(假设长度为k)。

假设si+k>sj+k,那么显然决策si...i+k是分别不优于决策sj...j+k的,直接跳过这一部分即可。si+k<sj+k同理。

时间复杂度O(n)

#include<bits/stdc++.h>
#define LL long long
#define RG register
#define R RG int
#define G if(++ip==ie)fread(ip=buf,1,SZ,stdin)
using namespace std;
const int SZ=1<<19,N=6e5+9;
int a[N];
char buf[SZ],*ie=buf+SZ,*ip=ie-1;
inline int in(){
    G;while(*ip<'-')G;
    R x=*ip&15;G;
    while(*ip>'-'){x*=10;x+=*ip&15;G;}
    return x;
}
int main(){
    R n=in(),i,j,k;
    for(i=0;i<n;++i)a[i]=a[i+n]=in();
    for(i=j=0;i<n&&j<n;(a[i+k]>a[j+k]?i:j)+=k+1){//跳过无用决策
        if(i==j)++j;//注意特判
        for(k=0;k<n&&a[i+k]==a[j+k];++k);//找LCP
    }
    for(i=min(i,j),j=i+n;i<j;++i)
        printf("%d ",a[i]);
    puts("");
    return 0;
}
posted @   Flash_Hu  阅读(406)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
西雅图
17:14发布
西雅图
17:14发布
6°
东南风
3级
空气质量
相对湿度
84%
今天
3°/13°
周六
小雨
6°/15°
周日
中雨
4°/15°