题解:

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

可以戳这里: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 1000000000
24 
25 #define maxn 300000+5
26 
27 #define maxm 20000000+5
28 
29 #define eps 1e-10
30 
31 #define ll long long
32 
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 1000000007
45 
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         else
79         {
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

相关文章: