KMP基礎題目合集

2021-10-08 14:19:28 字數 2152 閱讀 9030

kmp首先對字串進行處理,找到相同前字尾,減少遍歷次數,舉幾個例子

·a a b a a b a a a

-1 0 1 0 1 2 3 4 5 2

·a b c d a b c a

-1 0 0 0 0 1 2 3 1

i/(i-next[i]) 當前串的長度/迴圈節的長度 =連續重複資料組數

-1是對next [0] 陣列的初始化,字串與父串分別乙個指標,從0開始,如果no match,則子串返回next值的位置,減少重複對比。

nusoj 2867

題意:有t組資料,每組資料有兩個陣列a,b,長度分別是n,m。如果b在a中完整的出現。那麼輸出b在a**現的起始位置,如果有多個位置,則輸出最小的位置k。否則輸出-1。

input

25 3

1 2 3 4 5

3 4 5

5 21 2 3 4 5

3 5output3-1

#include

#include

#include

#include

#include

#define ll long long

#define ull unsigned long long

using

namespace std ;

const

int n =

1e5+6;

int next[n]

;int mm[n]

;int nn[n]

;void

init

(int len)

}int

kmp(

int n,

int m)

}return-1

;}intmain()

return0;

}

nusoj 2868 hdu 1358

子串可以看是新形式的"復讀",就列印這個位置和"復讀"的最大的次數。

輸入t。(t<=20)每組裡面有乙個字串str。長度小於5e5。

「hahaha」,在下標為3的時候,"haha"可以看成是由兩個"ha"復讀得到。所以輸出4 2。當下標為5時,"hahaha"可以看成是由三個"ha"復讀得到。所以輸出6 3。

「ddd」,在下標為3時,"dddd"可以看成是"dd"復讀得到,也可以看成是"d"復讀得到。最大次數為4。

輸出4 4。

input

3hahaha

dddd

mmyoutput

4 26 3

2 23 3

4 42 2

#include

#include

#include

using

namespace std ;

const

int n =

1e6+

6666

;char mm[n]

;int next[n]

;int m;

void

init()

return;}

intmain()

}}return0;

}

nusoj 2870 hdu 1686

求str1在str2**現了幾次

輸入乙個t,表示有t組。

每組資料有兩個字串str1,str2。

str1,str2字串。字串長度小於1e6。

input

2ala

alala

ddddd

output22

#include

#include

#include

using

namespace std ;

const

int n =

1e6+

6666

;char mm[n]

,nn[n]

;int next[n]

;int m,n;

void

init()

return;}

intkmp()

return ans;

}int

main()

return0;

}

回溯法題目合集 叄

給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。題目鏈結.解析過程 返回所有子集,因此不存在判斷條件和剪枝條件,每一次遞迴都需要將臨時陣列內容拷貝至二維陣列之中 求子集是求組合,因此元素不能有重複解,因此需要傳遞乙個sub變數作為下標,來控...

概率期望題目合集 1

51nod 1632 b君的連通 我們可以看出刪去 i 條邊會有 i 1 個聯通塊,所以可以得出以下的式子 ans sum frac textrm i 1 因為最後答案要乘上 2 所以化簡一下 倒序相加 可以得到 ans n 1 2 include include include include b...

區間DP入門題目合集

區間dp主要思想是先在小區間取得最優解,然後小區間合併時更新大區間的最優解。基本 mst dp,0 初始化dp陣列 for int i 1 i n i for int len 2 len n len 區間長度 for int i 1 i n i 列舉起點 51nod 1021 石子歸併 區間dp 題...