kmp專題 指定字串所有的公共前字尾

2021-09-19 20:45:22 字數 1393 閱讀 1155

題目大意:

給你乙個字串,問你它所有的公共前字尾(這裡和kmp不同的是認為:自身也可以是前字尾)

思路:這裡要知道next陣列的含義是:

字串下標從0開始

next[i] = k;

表示字串[0, i-1]的最長公共前字尾的長度為k

(並且前字尾的字元可以重複用: babab: 3(bab))

如果字串c有多個公共前字尾:

因為1和2是最長的公共前字尾,那麼1=2。

3和4也是公共前字尾,如圖還可以知道:3是1的字首,4是2的字尾。

當時1=2.所以:

3是1最長的公共字首,2是1最長的公共字尾。

同理:

所以我們就是求原串的最長公共前字尾。求最長公共前字尾的最長公共前字尾,。。。。。。。,一直到該串的最長公共前字尾=0。

當然最開始原串也算是自己的最長公共前字尾。

怎麼求自己最長公共前字尾的最長公共前字尾?

next[n]=自己最長公共前字尾的長度。那麼自己的最長公共前字尾為[0, next[n]-1]。

我們知道求[0, i-1]的最長公共前字尾就是next[i]。

那麼求[0, next[n]-1]的最長公共前字尾就是next[next[i]]一直迴圈下去

一直到next=0

#include

#include

#include

using

namespace std;

const

int maxn =

1000010

;char p[maxn]

;int f[maxn]

;vector<

int> v;

void

getval

(int l)

else

j = f[j];}

}int

main()

for(

int i=v.

size()

-1;i>=

0;i--

)printf

("\n");

}return0;

}

字串專題 擴充套件KMP

思路 乍一看就是擴充套件kmp,但這題還是要一點點轉化。如果想要滿足題目要求,匹配段肯定間隔是相反的。比如樣例中在0位置匹配 1 3 4 2 6 9 5 3 2 2 0 code include using namespace std const int ax 1e5 66 int n m int ...

( 字串專題 ) 擴充套件KMP

字串專題 擴充套件kmp 時間複雜度 o n m 用 extend i 表示t i n 1 與p的最長公共字首。假設t aaaab p aaaa 則extend 5 next i 表示為 串p 中以 i 為起點的字尾字串和 整個串p 的最長公共字首長度.假設p aaaab 則next 5 模板 in...

1576 替換所有的問號(字串)

1.問題描述 給你乙個僅包含小寫英文本母和 字元的字串 s,請你將所有的 轉換為若干小寫字母,使最終的字串不包含任何 連續重複 的字元。注意 你 不能 修改非 字元。題目測試用例保證 除 字元 之外,不存在連續重複的字元。在完成所有轉換 可能無需轉換 後返回最終的字串。如果有多個解決方案,請返回其中...