Luogu P1439 模板 最長公共子串行

2021-09-10 02:11:17 字數 1145 閱讀 6494

傳送門

這題怎麼能叫模板呢,分明是個變種題

解題思路:dp呀,這不是肯定dp嘛,dp[i][j]指的是a串到第i個字元,b串到第j個字元的最長公共子串行,看一眼資料,還要把二維優化成一維。**如下

#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const ll inf=0x3f3f3f3f;

const int maxn=1e5+5;

int dp[maxn];

int a[maxn],b[maxn],n;

int main()

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

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

} cout<50分!t的飛起(n也太大了呀),那這題還能怎麼解啊,一時之間毫無頭緒。可能這題是在告訴我們不能固定思維吧;

正解:求最長上公升子串行,這又是如何聯絡上的呢,由於題意說是1-n的排列(也是一開始沒有注意到的),所以可以一一對映,我們只要把第乙個序列對映成1,2,3...n,那在第二個序列的對映裡求乙個最長上公升子串行就行了。就拿題目給的例子舉個栗子:

3 2 1 4 5  我們將這個序列對映成1~n;那就是  3->1, 2->2, 1->3, 4->4, 5->5

該序列就變成了 (1) (2) (3) (4) (5)

1 2 3 4 5  這個序列根據對映規則同樣,變成了(3) (2) (1) (4) (5) 

由於對映規則相同,只需要在第二個序列中求最長上公升序列  (1) (4) (5) 對應得原數就是 3,4,5這一步轉化還是非常巧妙的。

這樣變成了求最長上公升子串行,複雜度為o(nlogn);

#includeusing namespace std;

const int maxn=1e5+5;

int n,be[maxn],la[maxn],tp,len=0;

int main()

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

else

} cout

}

Luogu P1439 模板 最長公共子串行

給出1 n的兩個排列p1和p2,求它們的最長公共子串行。輸入格式 第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。輸出格式 乙個數,即最長公共子串行的長度 資料規模 對於50 的資料,n 1000 對於100 的資料,n 100000 因為是給定的兩串數字是排列,所以可以利用一...

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