您的位置:首页 > 其它

【BZOJ 2882】工艺 最小表示法

2017-03-20 20:12 253 查看
YY了一个后缀数组的写法,肯定可以做,但是最小表示法方便多了,而且复杂度还是O(n)的。而且正确性很显然

#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 300021
using namespace std;
int n,s[maxn];

int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",s+i);
int a=1,b=2,i;
s[n+1]='z'+12;
while(a<=n&&b<=n){
for(i=0;s[a+i]==s[b+i]&&max(a,b)+i<=n;i++);
if(s[a+i]>s[b+i])a=a+i+1;
else b=b+i+1;
if(a==b)b++;
}
int bg=min(a,b);

if(bg==1){
for(int i=bg;i<=n;i++){
printf("%d",s[i]);
if(i!=n)printf(" ");
}
}else{
for(int i=bg;i<=n;i++)printf("%d ",s[i]);
for(int i=1;i<bg;i++){
printf("%d",s[i]);
if(i!=bg-1)printf(" ");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: