給出1-n的兩個排列p1和p2,求它們的最長公共子串行。
輸入格式:
第一行是乙個數n,
接下來兩行,每行為n個數,為自然數1-n的乙個排列。
輸出格式:
乙個數,即最長公共子串行的長度
普通求最長公共子串行的dp[i][j]的方法肯定不行
但這裡每個元素的值都是確定的了......
以f[i]表示i長度為i的最長公共子串行的最後乙個元素在a和b陣列中靠後的那乙個的位置,這樣貪心肯定是不對的
所以......
記錄每個元素在a中的位置,所以這是乙個的雙射
把b中的元素換成它在a中的位置,只要求乙個最長上公升子串行就可以了
1 #include2 #include3using
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 時間複雜度的演算法,概述如下 考慮兩個數...