最小表示法--理解定义:
下面展示怎么求解:
上代码:
int i=1,j=2,k=0;
while(i<=n && j<=n){//注意边界,i、j:字符串从哪里开始效益最大
k=0;
while(k<=n && g[i+k]==g[j+k]){k++;}//k的值只是暂时的
if(g[i+k]==g[j+k]){k++;}
else if(g[i+k]<g[j+k]){j=j+k+1;}
else{i=i+k+1;}
if(i==j){j++;}
}
所有代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int g[600010];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>g[i];
}
for(int i=1;i<=n;i++){
g[i+n]=g[i];
}
int i=1,j=2,k=0;
while(i<=n && j<=n){//注意边界,i、j:字符串从哪里开始效益最大
k=0;
while(k<=n && g[i+k]==g[j+k]){k++;}//k的值只是暂时的
if(g[i+k]==g[j+k]){k++;}
else if(g[i+k]<g[j+k]){j=j+k+1;}
else{i=i+k+1;}
if(i==j){j++;}
}
int res=min(i,j);
for(int i=res;i<=n;i++){cout<<g[i]<<' ';}
for(int i=1;i<res;i++){cout<<g[i]<<' ';}
return 0;
}
整数数组与字符串处理是一样的哦~