求S的最小循环串。我们构造出SS的SAM,从rt出发,每次选择标号最小的,走m次即可。字符集太大,我们只好map,还好求最小了呢(逃
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1200010
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int n=0,m,mx[N],last,rt,par[N],s[N>>2];
map<int,int>son[N];
inline void ins(int ch){
int p=last,np=++n;last=np;mx[np]=mx[p]+1;
for(;p&&!son[p][ch];p=par[p]) son[p][ch]=np;
if(!p){par[np]=rt;return;}
int q=son[p][ch];
if(mx[q]==mx[p]+1){par[np]=q;return;}
int nq=++n;son[nq]=son[q];mx[nq]=mx[p]+1;
par[nq]=par[q];par[q]=par[np]=nq;
for(;p&&son[p][ch]==q;p=par[p]) son[p][ch]=nq;
}
int main(){
// freopen("a.in","r",stdin);
m=read();last=rt=++n;
for(int i=1;i<=m;++i) ins(s[i]=read());
for(int i=1;i<=m;++i) ins(s[i]);
int p=rt;while(m--){
printf("%d ",son[p].begin()->first);
p=son[p].begin()->second;
}return 0;
}