P1439 模板 最長公共子串行 離散化

2022-05-01 16:18:09 字數 2555 閱讀 4261

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

輸入格式:

第一行是乙個數n,

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

輸出格式:

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

輸入樣例#1: 複製

5 

3 2 1 4 5

1 2 3 4 5

輸出樣例#1: 複製

3

這種方法只有1-n的全排列可以用

首先看到這道題很容易一下就想到dp(n^2),但是看看資料範圍,放棄dp,再看一看它題目給出的,這兩串數都是1到n的全排列,說白了就上下兩個串中的元素都是相同的,只有順序不同而已,那麼知道這個,我們又怎麼來解決這道題呢?

我們可以以第乙個串為標準,用第二個串來匹配第乙個串,看能匹配多少,所以,其實第乙個串的每個數字其實影響不大,只有知道它對應了第二串的哪個數字就好了,那麼我們為什麼不把他給的串重新定義一下?

比如他的樣例:3 2 1 4 5 我們把他變成 1 2 3 4 5 用乙個陣列記錄一下每個數字變成了什麼,相當於離散化了一下3-1;2-2;1-3;4-4;5-5;

現在我們的第二串1 2 3 4 5 按我們離散化的表示:3 2 1 4 5

可能有些人已經懂了,我們把第乙個串離散化後的陣列是滿足上公升,反過來,滿足上公升的也就是滿足原串的排列順序的,(如果你不懂的話可以多看幾遍這個例子)o(∩_∩)o~

好了 ,現在的問題就變成了求乙個最長不下降序列!好了!解決完成!

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define pb push_back

#define rep(i,n) for(int i=0;i

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define inf 0x3f3f3f3f

#define lson l,m,pos<<1

#define rson m+1,r,pos<<1|1

const

int n=100000+10

;int

a[n],b[n];

intbelong[n];

inttemp[n];

intmain()

rep(i,

1,n)

ri(b[i]);

int len=0

; rep(i,

1,n)

int pos=lower_bound(temp+1,temp+1+len,belong[b[i]])-temp;

temp[pos]=belong[b[i]];

}cout

<

}

view code

上面的並沒有普適性   必須為1-n的全排列

下面為樸素做法:

#include#include

#include

#include

using

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define pb push_back

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define inf 0x3f3f3f3f

const

int n=10000+5

;int

n,m,dp[n][n];

ints1[n],s2[n];

intmain()

view code

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...

P1439 模板 最長公共子串行

p1439 模板 最長公共子串行 這個題目我是沒想到反正我感覺十分的神奇先寫一下我在洛谷題解區看見的乙個很好理解的題解 對於樣例 3 2 1 4 5 1 2 3 4 5 我們可以把第乙個陣列編號位a b c d e 那麼第二個陣列就變成了c b a d e 現在對於第二個陣列的最長上公升子串行就是答...

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 1...