集訓總結DAY 1(18 5 22) KMP

2022-03-26 01:01:42 字數 1368 閱讀 1156

day 1——5.22

in the morning 依稀記得我們有一場contest。

at night

chf大佬講kmp,先膜一波~

luogup3375kmp模板題

一、樸素的做法  o(m*n)

嘗試列舉字串s2中的每個位置i,把字串s1與字串s2的字尾s2[i~m]對齊,向後掃瞄逐一比較s1[1]與s2[i],s1[2]與s2[i+1]......是否相等。

string

s1,s2;

//s1(n)>=s2(m)

for(int i=1;i<=n;i++)

}

二、hash!

在o(n)的時間內預處理乙個字串的所有字首hash值,並在o(1)的時間內查詢該字串任意子串的hash值。列舉s1中的每個位置i(m<=i<=n),檢查字串s2中的hash值與字串a中的子串s1[i-m+1~i]的hash值是否相同。

那麼,什麼是kmp?

1.對字串s1進行自我匹配,求出乙個陣列next,其中next[i]表示「s1中以s1結尾的非字首子串(有i-1個)」與「s1的字首」能夠匹配的最長長度。

如s1[2~i]與s1[1~i-1],s1[3~i]與s2[1~i-2]......

由此依次匹配對比,若得出的最大匹配值為k(即為參與比較的字串長度,若匹配,則其長度為匹配值),next[i]=k;  

next[i]=max,其中j

求next陣列

(1)初始化next[1]=j=0,假使next[1~i-1]已求出,求解next[i]。

(2)不斷嘗試擴充套件匹配長度j,如果擴充套件失敗(下乙個字元不相等),令j變為next[j],直至j變為0(應該重新從頭開始匹配)。

(3)如果能匹配成功,匹配長度j就增加1.next[i]的值就是j。

對於next陣列,老師在講課時又提出了幾個問題,能加深理解:

想清楚再看答案哦

question:next[i]是否能大於next[i-1]+1?  why?

answer: of course not.因為i表示從1~i的字首能匹配的最長字元個數。

next[1]=0

;for(int i=2,j=0;i<=n;i++)

2.對字串s1與s2進行匹配,求出乙個陣列f,其中f[i]表示「s2中以i結尾的子串」與「s1的字首」能夠匹配的最長長度。

f[i]=max,其中j<=i並且s2[i-j+1~i]=s1[1~j]

(其實求解f和next是很像的,自己寫看看)

完整code不再給了,上面的鏈結點開會有很多很優秀的正解~~

長沙集訓day5(總結)

哇,轉眼間已經來到這裡5天了哇,真快。哇。在這點消費就是高哇。t t1 求乙個數a的b次方,然後在,求a b的因數和。直接用快速冪求出a b,邊求邊取膜 然後最後從一迴圈到取膜玩的這個數,感覺程式沒什麼問題,但是 最後好像也就30分。t2 蘇軾吃菜。蘇軾吃個菜還賊講究,輸出 1.10分就到手了,也沒...

長沙集訓day1(總結)

今天是在長沙雅禮中學的第一天,上午到哪我嘞個哥,那麼多人。人與人座位之間間隔不超過10cm。真是無語 考試開始看到題目,直接粘.orz 看到知道題當沒弄懂題是啥意思 我還是太弱了 沒看見樣例解釋qaq,想了30分鐘才反應過來.想著用spfa直接求最短路就行,然後.然後.我tm忘了模板是啥了qaq.說...

暑期集訓Day 20 24 總結 (資料結構)

轉眼間,暑期訓練已經過了大半了。這半個多月以來也做了很多題,不過還是個菜雞。上乙個專題是字串專題,不過因為那個專題的題目沒有寫多少,所以。放到以後等做的題多一些再更新吧 這兩天學資料結構確實收穫不少,雖說之前對線段樹,bit這些早有耳聞,不過也僅僅是限於了解的層面,沒有像最近幾天系統的訓練過。漲了很...