博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1264: [AHOI2006]基因匹配Match
阅读量:5333 次
发布时间:2019-06-14

本文共 1228 字,大约阅读时间需要 4 分钟。

LCS+树状数组。

O(n^2)的朴素算法显然不可以。

但是根据朴素算法的递推式可知,只有a[i]==b[j]时,f才会更新。

而题目中相等的字符有且只有5个。

对于当前数,枚举它在另一个串的位置,更新答案。

重点是要发现更新的条件减少枚举次数。

#include
#include
#include
using namespace std;const int maxn = 100000 + 10;const int maxm = 20000 + 10;int n,n5,res;int f[maxn],a[maxn],b[maxn],p[maxm][6],cnt[maxm];struct s { int v[maxn]; inline int lowbit(int x) { return x&-x; } void update(int x,int val) { for(int i=x;i<=n5;i+=lowbit(i)) v[i]=max(v[i],val); } int query(int x) { int res=0; for(int i=x;i;i-=lowbit(i)) res=max(res,v[i]); return res; } void init() { memset(v,0,sizeof(v)); }}t;int main() { scanf("%d",&n); n5=n*5; t.init(); for(int i=1;i<=n5;i++) { scanf("%d",&a[i]); p[a[i]][++cnt[a[i]]]=i; } for(int i=1;i<=n5;i++) scanf("%d",&b[i]); for(int i=1,k;i<=n5;i++) for(int j=5;j>=1;j--) { k=p[b[i]][j]; f[k]=max(f[k],t.query(k-1)+1); t.update(k,f[k]); res=max(res,f[k]); } printf("%d\n",res); return 0; }

转载于:https://www.cnblogs.com/invoid/p/5669684.html

你可能感兴趣的文章
AndroidArchitecture
查看>>
安装Endnote X6,但Word插件显示的总是Endnote Web"解决办法
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>