#include <iostream> #include <algorithm> #include <string.h> #include <cstdio> #include <vector> using namespace std; const int maxn=2000005; int MinRepresstation(char * S, int len ) { int i = 0, j = 1, k = 0; while(i < len && j < len) { k = 0; while(k < len && S[(i + k)%len] == S[(j + k)%len]) k++; if(k >= len) break; if(S[(i + k)%len] > S[(j + k)%len]) i = max(i + k + 1, j + 1); else j = max(i + 1, j + k + 1); } return min(i ,j); } int MaxRepresstation(char * S, int len ) { int i = 0, j = 1, k = 0; while(i < len && j < len) { k = 0; while(k < len && S[(i + k)%len] == S[(j + k)%len]) k++; if(k >= len) break; if(S[(i + k)%len] > S[(j + k)%len]) j = max(i + 1, j + k + 1); else i = max(i + k + 1, j + 1); } return min(i ,j); } char s[maxn]; char s1[maxn],s2[maxn]; void getFail(char *P, int *f, int m) { f[0]=0; f[1]=0; for(int i=1; i<m; i++) { int j=f[i]; while(j&&P[i]!=P[j])j=f[j]; f[i+1]=P[i]==P[j]?j+1:0; } } int find(char *T,char *P, int *f,int n, int m) { getFail(P,f,m); int j=0; int num=0; for(int i=0; i<n-1; i++) { while(j&&P[j]!=T[i])j=f[j]; if(P[j]==T[i])j++; if(j==m){ num++; j=f[j]; } } return num; } int F[maxn]; int main() { while(gets(s)) { int len=strlen(s); int d1=MinRepresstation(s,len); int d2=MaxRepresstation(s,len); for(int i = 0 ; i < len ; i ++) s[ i + len ] = s[ i ]; for(int i=0; i<len; i++) { s1[i]=s[(i+d1)%len]; s2[i]=s[(i+d2)%len]; } int ans1=find(s,s1,F,len*2,len); int ans2=find(s,s2,F,len*2,len); printf("%d %d %d %d\n",d1+1,ans1,d2+1,ans2); } return 0; }
时间: 2024-11-05 13:39:38