本来想用来练习后缀自动机的,但是100w有点虚(事实证明确实T掉了)。
只好上最小表示法。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define uch unsigned char
uch s[10000005];
int l,pos;
int main()
{
scanf("%d",&l);
scanf("%s",s+1);
int i,j,k;
i=1;j=2;k=0;
while (i<=l&&j<=l)
{
k=0;
while (s[(i+k-1)%l+1]==s[(j+k-1)%l+1]&&k<=l) k++;
if (k==l) return i;
if (s[(i+k-1)%l+1]>s[(j+k-1)%l+1])
{
if (i+k+1>j) i=i+k+1;
else i=j+1;
}
else
{
if (j+k+1>i) j=j+k+1;
else j=i+1;
}
pos=min(i,j);
}
F(i,1,l) printf("%c",s[(i+pos-1-1)%l+1]);
}