字符串最小表示:找到一个位置,使得从这个位置开始的整个串字典序最小。 O(N)
char s[11000];
int Get_min(){
int n = strlen(s);
int i = 0,j = 1,k = 0,t;
//表示从i开始k长度和从j开始k长度的字符串相同
while(i < n && j < n && k < n){
t = s[(i+k)%n] - s[(j+k)%n];
//t用来计算相对应位置上那个字典序较大
if(!t) k++;//字符相等的情况
else{
if(t > 0) i += k+1;//i位置大,最大表示法: j += k+1
else j += k+1;//j位置大,最大表示法: i += k+1
if(i == j) j++;
k = 0;
}
}
return i < j ? i : j;
}
int Get_max(){
int n = strlen(s);
int i = 0,j = 1,k = 0,t;
//表示从i开始k长度和从j开始k长度的字符串相同
while(i < n && j < n && k < n){
t = s[(i+k)%n] - s[(j+k)%n];
//t用来计算相对应位置上那个字典序较大
if(!t) k++;//字符相等的情况
else{
if(t > 0) j += k+1;//i位置大,最大表示法: j += k+1
else i += k+1;//j位置大,最大表示法: i += k+1
if(i == j) j++;
k = 0;
}
}
return i < j ? i : j;
}
int main(){
int n;
scanf("%d",&n);
for(int i = 0;i < n;i ++){
scanf("%s",s);
printf("%d\n",Get_min());
printf("%d\n",Get_max());
}
}