传送门
解题思路
个人认为这根本不是模板,而这题更倾向于LCS在某种特殊情况下的一种优化时间的方法。
真正的模板:LCS模板
这道题就是在两个字符串都是1~n的全排列时可以把时间复杂度从n2优化到nlogn。
把s2中的每一个元素在s1中的位置用一个数组记录下来,然后对这个数组做一遍最长上升子序列(LIS),求得的答案也就是LCS的答案。
求LIS的时间复杂度是O(nlogn)(优化版的LIS),不会的请看模板:LIS模板
AC代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn=100005; 6 int n,a[maxn],b[maxn],weizhi[maxn],c[maxn],dp[maxn],cnt; 7 int main() 8 { 9 cin>>n; 10 for(int i=1;i<=n;i++){ 11 scanf("%d",&a[i]); 12 weizhi[a[i]]=i; 13 } 14 for(int i=1;i<=n;i++){ 15 scanf("%d",&b[i]); 16 c[i]=weizhi[b[i]]; 17 } 18 for(int i=1;i<=n;i++){ 19 if(c[i]>dp[cnt]) dp[++cnt]=c[i]; 20 else dp[lower_bound(dp+1,dp+cnt+1,c[i])-dp]=c[i]; 21 } 22 cout<<cnt; 23 return 0; 24 }