学习了一下最小最大表示法,还是挺好学的
#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; }
原文:http://blog.csdn.net/lj94093/article/details/44700359