目的:已知一个串S,求S的循环的同构字符串S‘中字典序最大/最小的一个,输出其位置,place∈[0,n-1]
设S=bcad,S‘=bcad,cadb,adbc,dbca,最小表示的S‘是adbc,位置是2,最大表示的S‘是dbca,位置是3
时间复杂度:O(n)
自用模板:
int get_minstring(char *s) //最小表示法 { int len=strlen(s); int i=0,j=1,k=0; while(i<len&&j<len&&k<len) { int t=s[(i+k)%len]-s[(j+k)%len]; if(t==0) k++; else { if(t>0) i=i+k+1; else j=j+k+1; if(i==j) j++; k=0; } } return min(i,j); } int get_maxstring(char *s) //最大表示法 { int len=strlen(s); int i=0,j=1,k=0; while(i<len&&j<len&&k<len) { int t=s[(i+k)%len]-s[(j+k)%len]; if(t==0) k++; else { if(t>0) j=j+k+1; else i=i+k+1; if(i==j) j++; k=0; } } return min(i,j); }
...
原文地址:https://www.cnblogs.com/myrtle/p/11517078.html
时间: 2024-10-16 14:08:16