原理证明看的http://blog.csdn.net/zy691357966/article/details/39854359
比较简单优美的算法,就找了个模板题做了下。
注意输出格式...否则PE
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 600005;
int n, s[maxn];
inline int iread() {
int f = 1, x = 0; char ch = getchar();
for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return f * x;
}
int MR() {
int i = 0, j = 1;
for(int k; i < n && j < n; ) {
for(k = 0; k < n && s[i + k] == s[j + k]; k++);
if(k == n) return i;
if(s[i + k] > s[j + k]) i = i + k + 1;
else j = j + k + 1;
if(i == j) j++;
}
return min(i, j);
}
int main() {
n = iread();
for(int i = 0; i < n; i++) s[n + i] = s[i] = iread();
int pos = MR();
for(int i = 0; i < n - 1; i++) printf("%d ", s[pos + i]); printf("%d\n", s[pos + n - 1]);
return 0;
}