p3402 最長公共子串行
經典問題
lcs-->lis
沒有重複的值才可以這麼做
把第一數列轉化成1~n,然後將第二個數列對映成1~n中的一些數,然後求第二個數列的lis即可,然後用bit求lis,o(nlogn)
//資料太大,考慮map
#include#includeview code#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;
}
我今天才算搞懂最長公共子串行的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...