Luogu P1439 模板 最長公共子串行

2022-04-30 19:12:11 字數 930 閱讀 9738

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

輸入格式:

第一行是乙個數n,

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

輸出格式:

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

【資料規模】

對於50%的資料,n≤1000

對於100%的資料,n≤100000

因為是給定的兩串數字是排列,所以可以利用一下排列的性質。

思考一下,如果兩串數字中有一串是形如1 2 3 4 5 .....的,那麼這個題的難度會大大降低,轉變為求另乙個串中的最長不下降子串行。

最長不下降子串行可以用nlogn的時間求出,這樣就可以卡進時限了。

又發現數字的排列方式對本題影響不大,所以我們離散化一下,把第乙個串強行離散成1 2 3 4 5 ......等於把每個數字對映一下,然後nlogn就可以了

#include#include

using

namespace

std;

const

int maxn = 100005

;int

n,len;

inta[maxn],b[maxn];

intid[maxn],dp[maxn],d[maxn];

intmain()

for(int i = 1;i <= n;i++)

inttmp;

for(int i = 1;i <= n;i++)

tmp = lower_bound(d + 1,d + 1 + len,id[b[i]]) -d;

d[tmp] =id[b[i]];

dp[i] =tmp;

}printf(

"%d\n

",len);

}

Luogu P1439 模板 最長公共子串行

傳送門 這題怎麼能叫模板呢,分明是個變種題 解題思路 dp呀,這不是肯定dp嘛,dp i j 指的是a串到第i個字元,b串到第j個字元的最長公共子串行,看一眼資料,還要把二維優化成一維。如下 include include include include include include includ...

洛谷1439 模板 最長公共子串行

題目 最長公共子串行 思路 這題用一般的dp來做,f i j 表示a的前i位和b的前j位的最長公共子串行的長度,時間複雜度為o n 2 在這題會tle。在這題中,需要用o nlogn 的複雜度實現。先設計乙個陣列b,b i 代表b串中的數第i個數在a串中的位置。例如 a串 3 2 1 4 5 b串 ...

P1439 模板 最長公共子串行

給出1 n的兩個排列p1和p2,求它們的最長公共子串行。第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。乙個數,即最長公共子串行的長度 輸入 1複製 5 3 2 1 4 5 1 2 3 4 5輸出 1複製 3 資料規模 對於50 的資料,n 1000 對於100 的資料,n 1...