首页 > 代码库 > BZOJ2882: 工艺

BZOJ2882: 工艺

题解:

裸的字符串最小表示。。。

可以戳这里:http://www.cnblogs.com/ACAC/archive/2010/05/23/1742349.html

这里说一下为什么a[i+k]>a[j+k]的时候可以让 i 跳到 i+k+1

也就是说i-i+k这一段不会有一个后缀成为最小表示的前缀,那我们只要构造出一个比它小的就可以了。

显然 如果我们取a[i+x]--a[i+k+1],我们总有a[j+x]--a[j+x+1]比它小,也就是在长度不及len的时候就不是最小了所以不可能是最小表示。

所以我们枚举起点看看它能够延伸多长始终都是同长度中最小的,当该长度为len的时候说明它就是最小表示。

还有最后为什么要返回min(i,j)

因为。。。挖坑待填。。。

代码:

技术分享
 1 #include<cstdio> 2  3 #include<cstdlib> 4  5 #include<cmath> 6  7 #include<cstring> 8  9 #include<algorithm>10 11 #include<iostream>12 13 #include<vector>14 15 #include<map>16 17 #include<set>18 19 #include<queue>20 21 #include<string>22 23 #define inf 100000000024 25 #define maxn 300000+526 27 #define maxm 20000000+528 29 #define eps 1e-1030 31 #define ll long long32 33 #define pa pair<int,int>34 35 #define for0(i,n) for(int i=0;i<=(n);i++)36 37 #define for1(i,n) for(int i=1;i<=(n);i++)38 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)40 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)42 #define for4(i,x) for(int i=head[x],y;i;i=e[i].next)43 44 #define mod 100000000745 46 using namespace std;47 48 inline int read()49 50 {51 52     int x=0,f=1;char ch=getchar();53 54     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}55 56     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();}57 58     return x*f;59 60 }61 int n,a[maxn];62 63 int main()64 65 {66 67     freopen("input.txt","r",stdin);68 69     freopen("output.txt","w",stdout);70 71     n=read();72     for0(i,n-1)a[i]=read();73     int i=0,j=1,k=0;74     while(i<n&&j<n&&k<n)75     {76         int t=a[(i+k)%n]-a[(j+k)%n];77         if(!t)k++;78         else79         {80             k=0;81             if(t>0)i+=k+1;else j+=k+1;82             if(i==j)i++;83         }84     }85     int ans=min(i,j);86     printf("%d",a[ans%n]);87     for1(i,n-1)printf(" %d",a[(ans+i)%n]);     88 89     return 0;90 91 }  
View Code

2882: 工艺

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 48  Solved: 24
[Submit][Status]

Description

小敏和小燕是一对好朋友。
他们正在玩一种神奇的游戏,叫Minecraft。
他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边。
他们想,在仅这一个操作下,最漂亮的工艺品能多漂亮。
两个工艺品美观的比较方法是,从头开始比较,如果第i个位置上方块不一样那么谁的瑕疵度小,那么谁就更漂亮,如果一样那么继续比较第i+1个方块。如果全都一样,那么这两个工艺品就一样漂亮。

Input

第一行两个整数n,代表方块的数目。
第二行n个整数,每个整数按从左到右的顺序输出方块瑕疵度的值。

Output

一行n个整数,代表最美观工艺品从左到右瑕疵度的值。

Sample Input


10
10 9 8 7 6 5 4 3 2 1

Sample Output


1 10 9 8 7 6 5 4 3 2

HINT



【数据规模与约定】

对于20%的数据,n<=1000

对于40%的数据,n<=10000

对于100%的数据,n<=300000

BZOJ2882: 工艺