lcs nlogn 算法
2016-04-16 11:59
197 查看
#include <map> #include <queue> #include <cmath> #include <cstdio> #include <cstring> #include <stdlib.h> #include <iostream> #include <algorithm> #define maxn 1005 using namespace std; int a[maxn],dp[maxn]; vector<int>location[26]; char s1[maxn],s2[maxn]; void init(){ for(int i=0;i<=maxn;++i) a[i]=dp[i]=0; } void LCS(){ init(); int i,j,k,w,ans,l,r,mid; int lena=strlen(s1),lenb=strlen(s2); for(i=0;i<26;i++)location[i].clear(); for(i=lenb-1;i>=0;--i)location[s2[i]-'a'].push_back(i); for(i=0,k=0;s1[i];i++) for(j=0;j<location[w=s1[i]-'a'].size();++j,++k) a[k]=location[w][j]; dp[1]=a[0]; dp[0]=-1; for(i=ans=1;i<k;++i){ l=0;r=ans; while(l<=r){ mid=(l+r)>>1; if(dp[mid]>=a[i])r=mid-1; else l=mid+1; } if(r==ans) ans++,dp[r+1]=a[i]; else if(dp[r+1]>a[i])dp[r+1]=a[i]; } cout<<ans<<'\12'; } int main(){ while(scanf("%s%s",s1,s2)!=EOF)LCS(); return 0; }
相关文章推荐
- HDU 2071
- VMware的安装
- uboot 移植遇到的问题及解决方法(转)
- eclipse aidl.exe error while creating directories
- leetcode 65. Valid Number
- rsync数据备份(二)--RHEL6.5
- 智能计算/计算智能、仿生算法、启发式算法的区别与关系?
- 解决Win10下Android Studio terminal无法输入的问题
- ios多线程操作(十二)—— 自定义NSOperation实现网络下载后回调
- ios多线程操作(十一)—— NSOperation的高级操作
- 一个Java音乐播放器
- CI 笔记2,(命令规范等)
- 人月神话阅读笔记01
- MySql中Blob与Text的区别
- 【Unity】6.2 在VS2015中调试 C# 脚本
- 使用ViewPager动画来做出不一样的引导页
- C++中如何重载<<
- 修改wordpress地址(URL)导致不能登录后台
- const和#define的区别
- 5.3 一致性