參考資料
約定:字串的下標從 \(0\) 開始。\(|s|\) 表示字串 \(s\) 的長度。
對於字串 \(s\),記其每乙個字元分別為 \(s_0, s_1, \cdots, s_\)。
子串 \(s_l, s_, \cdots, s_, s_r\) 簡記為 \(s[l:r]\)。特別地,若 \(l=0\),可記作 \(s[:r]\);若 \(r=|s|-1\),可記作 \(s[l:]\)。
對於字串 \(a, b\),\(a+b\) 表示拼接操作,即將字串 \(b\) 拼接到字串 \(a\) 之後,構成新的字串。
記構成的新字串為 \(c\),則上述拼接操作記為 \(c\gets a+b\)。
其中符號 \(x\gets y\) 表示將 \(y\) 的值賦給 \(x\)。
不論是字元還是字串,皆不加引號。
模板題若 \(\exist i,\ 1\leqslant i\leqslant |s|-1,\ t=s[i:]+s[:i-1]\),稱 \(s\) 和 \(t\) 互為迴圈同構串。
我們要求的是字串 \(s\) 的所有迴圈同構串中字典序最小的乙個。方便起見,記 \(s\left=s[i:]+s[:i-1]\) ,即以 \(i\) 為開始的迴圈同構串。
暴力比較顯然不行,我們要利用迴圈同構串的性質。
最小表示法
最小表示法就是找出字串s的的迴圈同構串中字典序最小的乙個。那麼什麼是迴圈同構串呢。是 設s bcad 且s 是s 的迴圈同構的串。s 可以是 bcad 或者cadb,adbc,dbca 即在字串s中從i 0開始,從i迴圈到字串末尾,再從頭迴圈到i,所形成的字元就是s迴圈同構串。因為這樣的同構串不止乙...
最小表示法
最小表示法 思想 在字串迴圈同構問題中的應用 摘自周源的ppt 前言 最小表示法 比起動態規劃 貪心等思想,在當今競賽中似乎並不是很常見。但是在解決判斷 同構 一類問題中卻起著重要的作用。本文即將討論字串中的同構問題,如何巧妙地運用最小表示法來解題呢,讓我們繼續一起思考吧。到底什麼是迴圈同構的字串呢...
最小表示法
最小表示法與kmp演算法一樣都可以解決字串匹配問題,但效率更高,短,作用更大。最小表示法就是乙個字串的最小字典序。怎麼求乙個字串的最小字典序呢?首先將這個字串擴充套件一倍 建設存在d陣列裡 然後我們用三個指標i 0,j 1,k 0,來尋找最小字典序的開頭字母,為了優於kmp,我們要做到o n i表示...