2018 07 14 T3 B君的第六題

2021-08-21 11:41:47 字數 3297 閱讀 2013

暫無鏈結

【問題描述】

丟掉幻想,準備鬥爭!

輸入四個長度為

n n

的序列ai

,bi,

ci,d

i。' role="presentation" style="position: relative;">ai,

bi,c

i,di

。ai,

bi,c

i,di

。 求這4

4

序列最長公共子串行的長度。

公共子串行不需要連續。

【輸入格式】

第一行乙個整數

n' role="presentation" style="position: relative;">nn。

第二行n個整數表示序列ai

a i。

第三行n個整數表示序列bi

b i。

第四行n個整數表示序列ci

c i。

第五行n個整數表示序列di

d i。

【輸出格式】

一行乙個整數,表示答案。

【輸入樣例】

5 1 2 1 2 3

1 2 3 1 2

3 1 2 1 2

1 2 1 2 1

【輸出樣例】

4 【資料範圍】

對於100

% 100

%的資料,滿足1≤

n≤10000

1 ≤n

≤10000

。 對於100

% 100

%的資料,1≤

ai≤n

,1≤b

i≤n,

1≤ci

≤n,1

≤di≤

n 1≤a

i≤n,

1≤bi

≤n,1

≤ci≤

n,1≤

di≤n

。 對於100

% 100

%的資料,在序列ai

a

i中,任何數字出現次數都 ≤2

2次。

對於100

% 100

%的資料,在序列bi

b

i中,任何數字出現次數都 ≤2

2次。

對於100

% 100

%的資料,在序列ci

c

i中,任何數字出現次數都≤2

2次。

對於30

% 30

%的資料,n≤

50 n≤50

。 對於另40

% 40

%的資料,ai

,bi,

ci,d

i ai,

bi,c

i,di

為四個1,

2,..

....

,n1 ,2

,...

...,

n的排列。

題解寫完o(

n4)d

p o(n

4)dp

後本來有個

70 70

分的夢想,覺得排列肯定有妙妙的性質,兩兩求出最長公共子串行以後取mi

n min

就行了,寫完了o(

6nlo

g2n)

o (6

nlog

2n

)以後,隨便ra

ndr an

d了組資料就把自己卡wa

w

a了。。。

夢想破滅,我太na

ive nai

ve

了。。。

先講講求兩個字串的最長公共子串行的方法,一般情況下是o(

n2) o(n

2)

的,但是我們有妙妙的性質啊,題目保證每個數出現的次數為常數範圍,我們就可以將乙個串中的數字替換為該數字在另乙個串裡的出現位置的倒序序列,舉個例子:13

4465

4519

361 34

4654

5193

6我們可以將下面的串替換為:(4

3)(6

)(1)

()(2

)(5)

( 43

)(6)

(1)(

)(2)

(5

)這樣,替換後的串的最長上公升子串行就是原串的最長公共子串行,求解複雜度為o(

nlog

2n) o(n

log2

n)

。我們用相同的方法,用di

d

i替換ai

,bi,

cia i,

bi,c

i,問題就轉化成了在三個序列中求最長公共不上公升子串行,我們將對應位置上的數字拆分出的序列三三組合看做乙個三維的物品,那麼問題就變成了四維偏序。

**

#include

using

namespace

std;

const

int m=2e5+5;

struct sdope[4][m];

bool cmp1(sd a,sd b)

bool cmp2(sd a,sd b)

int a[m],b[m],c[m],d[m],mx[m],len[m],n,tot;

vector

pa[m],pb[m],pc[m];

void in()

; }

}#define lb(x) (x&-x)

void clear(int x)

void add(int x,int d)

void solve(int cot)

for(int i=1;i<=cot;++i)if(!ope[2][i].op)clear(ope[2][i].c);

}void cdq(int v,int le,int ri)

for(int i=mid+1;i<=ri;++i)

if(v==1)sort(ope[v]+1,ope[v]+1+cot,cmp1);else sort(ope[v]+1,ope[v]+1+cot,cmp2);

if(v==1)cdq(v+1,1,cot);else solve(cot);

cdq(v,mid+1,ri);

}void ac()

int main()

coursera 中計算概論的第六周 B 05作業

描述 給定乙個正整數a,以及另外的5個正整數,問題是 這5個整數中,小於a的整數的和是多少?輸入輸入一行,只包括6個小於100的正整數,其中第乙個正整數就是a。輸出輸出一行,給出乙個正整數,是5個數中小於a的數的和。樣例輸入 10 1 2 3 4 11 樣例輸出 10 include using n...

第六周實踐專案3 括號的匹配

檔名稱 專案3.cbp 作 者 劉晨筱 完成日期 2015年12月1日 版 本 號 v1.0 問題描述 假設表示式中允許三種括號 圓括號 方括號和大括號。編寫乙個演算法,判斷表示式中的各種左括號是否與右括號匹配。例如,輸入2 3 4 2 8,輸出匹配正確 輸入2 3 4 2 8,輸出匹配錯誤。輸入描...

神奇的Perl 第六個任務 3

per 程式必須小心處理字元編碼,否則可能造成亂碼 正則匹配錯誤等莫名其妙的問題。1 23 語法格式如下 binmode 裝置控制代碼,encoding 編碼 裝置控制代碼可以是 stdout stdin stderr 以及自定義的檔案控制代碼。中文字元編碼主要使用兩種 utf8 和gbk 以下是幾...