poj2774兩串最長公共子串

2021-07-11 17:32:09 字數 1097 閱讀 3981

思路:字尾陣列。(摘自羅穗騫的國家集訓隊**)字串的任何乙個子串都是這個字串的某個字尾的字首。求 a 和 b 的最長公共子串等價於求 a 的字尾和 b 的字尾的最長公共字首的最大值。如果列舉a和 b 的所有的字尾,那麼這樣做顯然效率低下。由於要計算 a 的字尾和 b 的字尾的最長公共字首,所以先將第二個字串寫在第乙個字串後面,中間用乙個沒有出現過的字元隔開,再求這個新的字串的字尾陣列。觀察一下,看看能不能從這個新的字串的字尾陣列中找到一些規律。以 a=「 aaaba 」,b=「 abaa 」為例,如圖 8 所示。

那麼是不是所有的 height 值中的最大值就是答案呢?不一定!有可能這兩個字尾是在同乙個字串中的,所以實際上只有當suffix(sa[i-1])和suffix(sa[i]) 不是同乙個字串中的兩個字尾時,height[i]才是滿足條件的。而這其中的最大值就是答案。記字串 a 和字串 b 的長度分別為|a|和|b|。求新的字串的字尾陣列和 height 陣列的時間是 o(|a|+|b|) ,然後求排名相鄰 但原來不在同乙個字串中的兩個字尾的height值的最大值,時間也是o(|a|+|b|),所以整個做法的時間複雜度為 o(|a|+|b|) 。時間複雜度已經取到下限,由此看出,這是乙個非常優秀的演算法。

#include

#include

#include>

#include

#define maxn 200020

using

namespace

std;

int wa[maxn],wb[maxn],wv[maxn],ws[maxn];

int cmp(int *r,int a,int b,int l)

void da(const

int *r,int *sa,int n,int m)

return;

}int sa[maxn],rank[maxn],height[maxn];

void calheight(int *r,int *sa,int n)

int main()

字尾陣列求最長公共子串 POJ 2774

根據羅的 兩個串的中間要加乙個ascii碼比任何字母都小的字元 最長公共子串 pku2774,ural1517 給定兩個字串a 和b,求最長公共子串。演算法分析 字串的任何乙個子串都是這個字串的某個字尾的字首。求a 和b 的最長公共子串等價於求a 的字尾和b 的字尾的最長公共字首的最大值。如果列舉a...

poj 最長公共子串行和最長公共子串

最長公共子串行 poj1458 問題描述 給出兩個字串,求出這樣的乙個最長的公共子串行的長度 子串行中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的先後順序一致。sample input abcfbc abfcab programming contest abcd mnp samp...

最長公共子串 最長公共子串 動態規劃

有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在1000以內 例如 輸入 abcde bcd 輸出 3 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。3 通過查詢出值為1的最長對角線就能找到最長公...