【板子】字符串最小表示法

//lg p1368
//Copyright yeyou26
#include<bits/stdc++.h>
using namespace std;

const int N = 300005;

int a[2*N];
int n;

void init()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        long long x;
        scanf("%d",&x);
        a[i]=a[i+n]=x;
    }
}

void solve()
{
    int i=1,j=2,k=0;
    while(i<=n && j<=n)
    {
        k=0;
        while(a[i+k]==a[j+k] && k<n) k++;
        if(a[i+k]>a[j+k]) i=i+k+1;
        else j=j+k+1;
        if(k==n) break;
        if(i==j) j++;
    }
    int ans=min(i,j);
    for(int p=1;p<=n;p++)
    {
        printf("%d ",a[ans+p-1]);
    }
}

int main()
{
    freopen("working.in","r",stdin);
    freopen("working.out","w",stdout);
    init();
    solve();
    return 0;
}
posted @   yeyou26  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示