最小(大)表示法

/*
最小(大)表示法:用以解决循环同构字符串的求最小(大)字典序。
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';
}

  

posted @ 2015-03-16 09:23  tcgoshawk  阅读(111)  评论(0)    收藏  举报