分析
模板题;运用到最小表示法具体实现见代码,网上的题解也很多
#include<bits/stdc++.h>
using namespace std;
char s[1000005];
int MINSTR(){
int len=strlen(s+1);
for(int i=1;i<=len;i++)s[i+len]=s[i];
int i=1,j=2,k=0;
while(i<=len&&j<=len&&k<len){
if(s[i+k]==s[j+k])k++;//如果无法比较出结果就继续比较
else if(s[i+k]<s[j+k])j=j+k+1,k=0;//如果说是这样的话就是说在j+k处字符串失配了,i~j+k的所有的字符串都不能是最优的答案,所以说就像KMP的失配边一样沿着状态机(好吧这里没有状态机QwQ)走就好了
else i=i+k+1,k=0;//如果说i不是最优解的话就跟新i,为什么跟上面的一样
if(i==j)j++;//如果到了同一个起点的话就继续匹配
}
return min(i,j);//输出两个指针较小的一个
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
getchar();
scanf("%c",&s[i]);//读入问题解决
}
cout<<MINSTR(a,n)<<endl;
return 0;
}