学习了一下最小最大表示法,还是挺好学的
#include<stdio.h>
#include<algorithm>
char s[1000005];
int next[1000005];
int n;
//i,j两个指针所指的位置可以保证已经是该指针之前的串里,最优的了
int min(int a,int b){
if(a<b) return a;
return b;
}
int max(int a,int b){
if(a>b) return a;
return b;
}
void get_next(){
int i,j;
j=-1;
next[0]=-1;
i=0;
while(i<n){
while(j!=-1&&s[j]!=s[i]) {
j=next[j];
}
next[++i]=++j;
}
}
int min_presentation(){
int i=0,j=1,k;
while(i<n&&j<n){
k=0;
while(k<n && s[(i+k)%n]==s[(j+k)%n]) k++;
if(k==n) break;//已找到
if(s[(i+k)%n]>s[(j+k)%n]) i=max(i+k+1,j+1);
else j=max(i+1,j+k+1);
}
return min(i,j);
}
int max_presentation(){
int i=0,j=1,k;
while(i<n&&j<n){
k=0;
while(k<n && s[(i+k)%n]==s[(j+k)%n]) k++;
if(k==n) break;//已找到
if(s[(i+k)%n]>s[(j+k)%n]) j=max(i+1,j+k+1);
else i=max(i+k+1,j+1);
}
return min(i,j);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int cas=0,i,j;
while(scanf("%s",s)!=EOF){
n=0;
while(s[n]!='\0') n++;
for(i=0,j=n;i<n;j++,i++) s[j]=s[i];
get_next();
int k=n-next[n];
if(n%k==0) printf("%d %d %d %d\n",min_presentation()+1,n/k,max_presentation()+1,n/k);
else printf("%d %d %d %d\n",min_presentation()+1,1,max_presentation()+1,1);
}
return 0;
}