最小(大)表示法
/*
最小(大)表示法:用以解决循环同构字符串的求最小(大)字典序。
S为原字符串的循环同构体。
*/
void get_min(char *S){
int len=strlen(S);
int i=0,j=1,k=0;
while(i<len&&j<len){
if(k==len)
break;
if(S[(i+k)%len]>S[(j+k)%len]){
i=i+k+1>j?i+k+1:j+1;
k=0;
}else if(S[(j+k)%len]>S[(i+k)%len]){
j=j+k+1>i?j+k+1:i+1;
k=0;
}else{k++;}
}
int min_pos=min(i,j);
for(int i=min_pos;i<len;i++){
min_sub[i-min_pos]=S[i];
}
for(int i=0;i<min_pos;i++){
min_sub[len-min_pos+i]=S[i];
}
min_sub[len]='\0';
}
学学学 练练练 刷刷刷

浙公网安备 33010602011771号