最小表示法 (学习笔记)(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);

题目

P10476 Necklace

模板题,没什么好说的

posted @ 2025-11-14 19:02  Yuriha  阅读(4)  评论(0)    收藏  举报