【題目大意】
求兩個字串的最長公共子串。
【思路】
對第乙個字串建立字尾自動機,第二個字串去匹配。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 #include6using
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 當然我們現在一眼就可以看出來最長公...