P3402 最長公共子串行

2022-03-09 07:43:20 字數 2387 閱讀 4721

p3402 最長公共子串行

經典問題

lcs-->lis

沒有重複的值才可以這麼做

把第一數列轉化成1~n,然後將第二個數列對映成1~n中的一些數,然後求第二個數列的lis即可,然後用bit求lis,o(nlogn)

//資料太大,考慮map

#include#include

#include

#include

#include

#include

#include

#include

#define inf 2147483647

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

#define p(a) putchar(a)

#define g() getchar()

//by war

using

namespace

std;

intn,m;

int t[300010

];int

ans;

int f[300010

];int a[300010

];int b[300010

];int

x;map

c;void

in(int &x)

while(c<='

9'&&c>='

0')x=x*10+c-'

0',c=g();

x*=y;

}void o(int

x)

if(x>9)o(x/10

); p(x%10+'0'

);}int getmax(int

k)void modify(int k,int

max)

intmain()

o(ans);

return0;

}

view code

我今天才算搞懂最長公共子串行的nlogn的做法,下面的是任何情況都適用的

5 4 1 1 2

1 2 4,3 4,3 5

1 1 4

4 3 4 3 5

在4 3 4 3 5裡面求嚴格遞增的lis就是二者的lcs

#include #define inf 2147483647

#define n 1000010

#define p(a) putchar(a)

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

//by war

using

namespace

std;

long

long

n,m,cnt;

long

long

t[n],a[n],b[n],temp[n];

long

long

ans0,ans1;

long

long

x;map

long,long

long>c,d;

vector

long>v[n],u;

stack

st;void

in(long

long &x)

while(c<='

9'&&c>='0')

x*=y;

}void o(long

long

x)

if(x>9)o(x/10

); p(x%10+'0'

);}long

long getmax(long

long

k)void modify(long

long k,long

long

max)

signed main()

else

v[c[b[i]]].push_back(i);

temp[i]=b[i];

}sort(temp+1,temp+n+1

); for(i,

1,n) d[temp[i]]=i;

for(i,

1,n) b[i]=d[b[i]],u.push_back(b[i]);

cnt=u.size();

for(auto i:u)

u.clear();

for(i,

1,m) in

(a[i]);

for(i,

1,m)

}memset(t,

0,sizeof

(t));

for(auto i:u)

o(ans0);p(''

);o(ans1);

return0;

}

P3402 最長公共子串行(nlogn)

先看一下資料規模 n 300000,n 2的做法肯定就要掛掉了,所以用到了這個nlogn的做法。先介紹一下nlogn的做法 最長公共子串行 的 nlogn 的演算法本質是 將該問題轉化成 最長增序列 lis 因為 lis 可以用nlogn實現,所以求lcs的時間複雜度降低為 nlogn。轉化 將lc...

洛谷P3402 最長公共子串行

題目背景 djl為了避免成為乙隻鹹魚,來找johann學習怎麼求最長公共子串行。題目描述 經過長時間的摸索和練習,djl終於學會了怎麼求lcs。johann感覺djl孺子可教,就給他布置了乙個課後作業 給定兩個長度分別為n和m的序列,序列中的每個元素都是正整數。保證每個序列中的各個元素互不相同。求這...

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...