bzoj 2882(最小表示法)
2017-08-14 15:54
246 查看
传送门
问题:将原串复制一次接到尾部,找出构成的新串中长度为原串长度且字典序最小的串并输出。
自己也讲不清楚,只是意会。。。转一篇讲解。
O(n)求字符串最小表示法
P.S.此题还可以用后缀自动机解决,然而本蒟蒻并不会写orz。
问题:将原串复制一次接到尾部,找出构成的新串中长度为原串长度且字典序最小的串并输出。
自己也讲不清楚,只是意会。。。转一篇讲解。
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; }
相关文章推荐
- BZOJ 2882: 工艺 最小表示法
- bzoj 1398 &&bzoj 2882最小表示法
- BZOJ 2882 工艺 ——后缀自动机 最小表示法
- 【BZOJ2882】工艺【最小表示法】
- 【最小表示法】BZOJ2882-工艺
- 【BZOJ2882】【字符串的最小表示】工艺
- BZOJ.2882.工艺(后缀自动机 最小表示 map)
- BZOJ 2882 浅谈最小表示法后缀数组求解+线性求解
- [最小循环表示 后缀自动机 模板题] BZOJ 2882 工艺
- bzoj2882 工艺【最小表示法】
- bzoj2882 工艺(后缀自动机(最小表示法))
- [BZOJ2882]工艺(后缀自动机+stl||最小表示法)
- BZOJ 2882 后缀数组/最小表示法 解题报告
- BZOJ 2882 工艺 字典序最小的循环同构串(最小表示法 详解)
- 【BZOJ 2882】工艺 最小表示法
- 【bzoj2882】【工艺】【最小表示法】
- [BZOJ]2882 工艺 最小表示法
- BZOJ 1398: Vijos1382寻找主人 Necklace【字符串最小表示
- 【bzoj1398】Vijos1382寻找主人 Necklace 最小表示法
- bzoj4484[Jsoi2015]最小表示 拓补排序+bitset