参考http://blog.csdn.net/acm_cxlove/article/details/7909087
KMP+最大最小表示法
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define N 1000005
using namespace std;
char str[N];
int fail[N];
void kmp(int m){
fail[0]=-1;
for(int i=1,j=-1;i<m;i++){
while(j>=0&&str[i]!=str[j+1])
j=fail[j];
if(str[i]==str[j+1])
j++;
fail[i]=j;
}
}
int min_max_express(int p){
int i=0,j=1,k=0;
int n=strlen(str);
while(i<n&&j<n&&k<n){
int t=str[(j+k)%n]-str[(i+k)%n];
if(t==0)
k++;
else {
if(t*p>0){
i+=k+1;
}else {
j+=k+1;
}
if(i==j)
j++;
k=0;
}
}
return min(i,j);
}
int main()
{
while(~scanf("%s",str)){
int ans1=min_max_express(1);
int ans2=min_max_express(-1);
int n=strlen(str);
kmp(n);
int ans3=1;
if(fail[n-1]!=-1)
if(n%(n-1-fail[n-1])==0){
ans3=n/(n-1-fail[n-1]);
}
printf("%d %d %d %d\n",ans2+1,ans3,ans1+1,ans3);
}
return 0;
}