最小表示法 (学习笔记)(25.11.14)
最小表示法 (学习笔记)
概述
使用一个双指针,然后可以实现在一个环中寻找一个最小的串
推导
可以使用KMP类似的思想,若有相等的字符就不去考虑,发现失配就开始比较
让前\(k\)个字符均相同,所以
\[S[i…i+k-1]=S[j…j+k-1]
\]
考虑在\(S[i+k] > S[j+k]\)的情况,我们发现从\(i\)为起始点到\(i+k\)都不能形成答案,所以我们就跳过下标\([i,i+k]\),直接比较\(S_{i+k+1}\)及其之后的串
实现
所以我们对\(i和j\)进行枚举并且往后比较,在其中一个下标超过\(n\)之后,就可以直接输出\(j或i较小一个\)为起点的一个串了
int k=0, i=0, j=0;
while(k<n&&i<n&&j<n){
//这里如果两个一样就去加一下k的值
if(sec[(i+k)%n]==sec[(j+k)%n]){
k++;
}
else{
//这里如果发生一个比另一个大,就去把指针之间跳转到另一个后面
sec[(i+k)%n] > sec[(j+k)%n] ? i = i+k+1 : j = j+k+1;
//防止一直相等然后出错
if(i==j)i++;
k=0;
}
}
i = min(i,j);
题目
模板题,没什么好说的

浙公网安备 33010602011771号