分析:
让原始序列变成 2*n的长度 。
然后用kmp算法找到 模式串的位置,然后记录位置d, n - d就是它的执行次数。
如果没有匹配到,就不能变成之前的样子。
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
int n;
int p[maxn],a[maxn<<1];
int Next[maxn];
int ans;
void init(){
for (int i=0; i<n; i++) {
scanf("%d",&p[i]);
a[i] = p[i];
}
for (int i=n; i<2*n; i++) a[i] = a[i-n];
sort(p,p+n);
}
void get_next(){
Next[0] = Next[1] = 0;
int j = 0;
for (int i=1; i<n; i++) {
while (j && p[j]!=p[i]) j = Next[j];
if (p[j]==p[i]) j++;
Next[i+1] = j;
}
}
void Find(){
ans = -1;
int j = 0;
for (int i=0; i<2*n; i++) {
while (j && p[j]!=a[i]) j = Next[j];
if (p[j]==a[i]) j++;
if (j==n) {ans = i-j+1; j = Next[j];}
}
}
int main(){
while (scanf("%d",&n)!=EOF){
init();
get_next();
Find();
if (ans==-1) printf("-1\n"); else printf("%d\n",n-ans);
}
return 0;
}