bzoj 2882(最小表示法)

来源:互联网 发布:java变量初始化 编辑:程序博客网 时间:2024/06/03 22:38

传送门
问题:将原串复制一次接到尾部,找出构成的新串中长度为原串长度且字典序最小的串并输出。
自己也讲不清楚,只是意会。。。转一篇讲解。
O(n)求字符串最小表示法
P.S.此题还可以用后缀自动机解决,然而本蒟蒻并不会写orz。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN=3e5+2;int a[MAXN<<1],n;inline int read() {    int x=0,f=1;char c=getchar();    while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}    while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();    return x*f;}inline int MR() {    int i=0,j=1;    for (int k;i<n&&j<n;) {        for (k=0;a[i+k]==a[j+k];++k);        if (k==n) return i;        if (a[i+k]>a[j+k]) i+=k+1;        else j+=k+1;        if (i==j) ++j;    }    return i<j?i:j;}int main() {//  freopen("bzoj 2882.in","r",stdin);    n=read();    for (register int i=0;i<n;++i) a[i+n]=a[i]=read();    int pos=MR();    for (register int i=0;i<n-1;++i) printf("%d ",a[pos+i]);    printf("%d\n",a[pos+n-1]);    return 0;}
原创粉丝点击