首页 > 代码库 > 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 }
2882: 工艺
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 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: 工艺
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。