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 題...