http://acm.hdu.edu.cn/showproblem.php?pid=3374
详解https://wenku.baidu.com/view/b0ef1be7a6c30c2258019ede.html
字符串最大最小表示法 求出起始位置
#include <bits/stdc++.h>
using namespace std;
int go[1000010];
int n;
char ch[1000010];
void kmp()
{
int i,j;
go[0]=-1;
i=0,j=-1;
while(i<n)
{
if(j==-1||ch[i]==ch[j])
{
i++,j++;
go[i]=j;
}
else j=go[j];
}
return;
}
int getmm(int flag)//0最小 1最大
{
int i,j,k,t;
i=0,j=1,k=0;
while(i<n&&j<n&&k<n)
{
t=ch[(i+k)%n]-ch[(j+k)%n];
if(!t) k++;
else
{
if(flag)
{
if(t>0) j+=(k+1);
else i+=(k+1);
}
else
{
if(t>0) i+=(k+1);
else j+=(k+1);
}
if(i==j) j++;
k=0;
}
}
return min(i,j)+1;
}
int main()
{
int i,minn,maxx,l;
while(scanf("%s",ch)!=EOF)
{
n=strlen(ch);
kmp();
minn=getmm(0);
maxx=getmm(1);
if(n%(n-go[n])==0) l=n/(n-go[n]);
else l=1;
printf("%d %d %d %d\n",minn,l,maxx,l);
}
return 0;
}