luogu 模板 最長公共子串行

2022-05-08 06:15:08 字數 643 閱讀 7932

給出1-n的兩個排列p1和p2,求它們的最長公共子串行。

輸入格式:

第一行是乙個數n,

接下來兩行,每行為n個數,為自然數1-n的乙個排列。

輸出格式:

乙個數,即最長公共子串行的長度

普通求最長公共子串行的dp[i][j]的方法肯定不行

但這裡每個元素的值都是確定的了......

以f[i]表示i長度為i的最長公共子串行的最後乙個元素在a和b陣列中靠後的那乙個的位置,這樣貪心肯定是不對的

所以......

記錄每個元素在a中的位置,所以這是乙個的雙射

把b中的元素換成它在a中的位置,只要求乙個最長上公升子串行就可以了

1 #include2 #include3

using

namespace

std;

4const

int maxn=1e5+7;5

intn,ans,l,r,mid;

6int

a[maxn],b[maxn],tmp[maxn],f[maxn];

7int

main()

20 f[l]=b[i];21}

22}23 cout24return0;

25 }

模板 最長公共子串行

以洛谷p1439為例 n可以開到1e5 tle mle 編譯都過不了 讀入a陣列後雜湊一波,然後將b陣列的值在雜湊陣列裡找到對應值並替換,於是變成了求b陣列最長上公升子串行 玄學 可以使用二分,時間複雜度o nlogn ac include include include include using...

模板 最長公共子串行

題源 問題能轉化成二分求最長上公升子串行 lower bound 返回第乙個大於等於查詢值的位置 lower bound 返回第乙個小於查詢值的位置 binary search 返回判斷查詢值在不在的 bool 值 include define numm ch 48 define pd putcha...

模板 最長公共子串行

洛谷p1436 模板 我們定義對映f ai i,那麼兩個排列可以轉換為 f a1 f a2 f an 1,2,n 和 f b1 f b2 f bn 我們進行這樣的轉換之後,就把本題轉換為求最長上公升子串行的長度的題目了。最長上公升子串行存在o n log n 時間複雜度的演算法,概述如下 考慮兩個數...