luooj最强阵容加强版

传送门

分析

模板题;运用到最小表示法具体实现见代码,网上的题解也很多

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_36316033/article/details/80055789
今日推荐