題目描述
給出1-n的兩個排列p1和p2,求它們的最長公共子串行。
輸入輸出格式
輸入格式:
第一行是乙個數n,
接下來兩行,每行為n個數,為自然數1-n的乙個排列。
輸出格式:
乙個數,即最長公共子串行的長度
輸入輸出樣例
輸入樣例#1:
5 3 2 1 4 5
1 2 3 4 5
輸出樣例#1:
說明【資料規模】
對於50%的資料,n≤1000
對於100%的資料,n≤100000
單調佇列+二分查詢
var n,tot:longint;
x,y,q:array[0..100005]of longint;
procedure
init;
var i,j,turn:longint;
begin
readln(n);
for i:=1
to n do
begin
read(turn);
x[turn]:=i;
end;
for i:=1
to n do
read(y[i]);
end;
function
find
(x:longint):longint;
var l,r,mid:longint;
begin
l:=0;r:=tot;
while l<=r do
begin
mid:=(l+r) div
2; if q[mid]then l:=mid+1
else r:=mid-1;
end;
exit(l);
end;
procedure
main;
var i,p:longint;
begin
tot:=0;
fillchar(q,sizeof(q),0);
for i:=1
to n do
begin
p:=find(x[y[i]]);
if p>tot then
begin
inc(tot);
q[tot]:=x[y[i]];
endelse q[p]:=x[y[i]];
end;
end;
procedure
print;
begin
write(tot);
end;
begin
init;
main;
print;
end.
xjb 洛谷 P1439 排列LCS問題
這個一看就是n n的暴力嘛,但是n有點大 因為是兩個排列,換句話說沒有重複的數字 那我們可以轉化一下 比如樣例 5 3 2 1 4 5 1 2 3 4 5 我們把下面一行的值變成上面一行的位置 3 2 1 4 5 那麼直接最長上公升子串行就好了 為什麼呢?比如第二行第乙個數1 如果我們選了1,那麼後...
洛谷P1439 最長公共子串行(LCS問題)
給出1 n的兩個排列p1和p2,求它們的最長公共子串行。輸入格式 第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。輸出格式 乙個數,即最長公共子串行的長度 輸入樣例 1 複製5 3 2 1 4 5 1 2 3 4 5 輸出樣例 1 複製3 資料規模 對於50 的資料,n 100...
最長公共子串行問題(LCS) 洛谷 P1439
題目 p1439 模板 最長公共子串行 洛谷 電腦科學教育新生態 luogu.com.cn 關於lcs問題,可以通過離散化轉換為lis問題,於是就可以使用stl二分的方法o nlogn 解決lcs問題!先將a陣列與乙個遞增的數列1,2,3.n兩兩對應 t陣列 再把b陣列中每個數在a陣列中的位置表示成...