【笔记】字符串最小表示法
作者:
就爱摆烂_3
,
2022-11-10 13:01:47
,
所有人可见
,
阅读 220
字符串最小表示法 用于求循环同构串中字典序最小的字符串
O(n²)做法
将字符串a[n]扩大二倍 得到b[2 * n]
通过枚举所有起点 得到长度为n的字串 记录字典序最小的字串
就可以得到字符串的最小表示
设字符串长度为n
void get_min(int a[]){
static int b[2 * n];
for(int i = 0 ; i < 2 * n ; i++) b[i] = a[i % n];
int i = 0 , j = 1, k;
while(i < n && j < n){
for(k = 0; k < n && b[i + k] == b[j + k]; k ++);
if(k == n) break;
if(b[i + k] > b[j + k]) {
i += k + 1;
if(i == j ) i ++;
}
else {
j += k + 1;
if(i == j) j ++;
}
}
k = min(i,j);
for(int i = 0 ;i < n ; i++) a[i] = b[i + k];
}