SAM codevs3160 最長公共子串

2022-08-09 06:39:10 字數 967 閱讀 7292

【題目大意】

求兩個字串的最長公共子串。

【思路】

對第乙個字串建立字尾自動機,第二個字串去匹配。cnt記錄當前最長公共子串的長度,而ret記錄答案。

p代表位置指標,初始在rt位置。

對於第二個字串的某一位s[i],如果當前有s[i]孩子,則cnt+1,繼續往後移動;否則沿著pre指標返回。如果pre指標返回到0,則將p回到rt,cnt清空為0;否則如果中間有點擁有s[i]孩子,cnt=step+1。

為什麼cnt=step+1?不要忘了字尾自動機的本質是維護字尾,沿著pre指標跑就是往長度更小的字尾移動,某位置代表的字尾的最長長度為step,再加上s[i],即是step+1。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int maxn=100000+5;8

intn;

9char str[2

][maxn];

10struct

sam11

2122 inline void extend(int

x)23

4041

}42 last=np;43}

4445 inline void

clear()

4650

51 inline int

query()

5266 ret=max(ret,cnt);

67}

68return

ret;

69}

70}suf;

7172

void

init()

7381

82int

main()

83

CodeVS 3160 最長公共子串

看了好久的字尾自動機 對a串建立sam,用b串去匹配a串sam,如果在當前節點走不下去,就跳到當前節點的parent 類似ac自動機的失配指標 找到當前節點代表的狀態中長度最長的字尾,並看能不能繼續走下去。如果跳到了能繼續走下去的節點,就更新l為這個節點的max 1,同時在這個節點往下走一步 更新l...

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...