bzoj 1264: [AHOI2006]基因匹配Match

来源:互联网 发布:淘宝无线端首页模板 编辑:程序博客网 时间:2024/05/22 15:48

前言:

我个大SB树状数组都写挂贡献两发wa被ozyD飞。

题意:

有特殊条件的最长公共子序列。

题解:

dp+树状数组。
直接暴力dp显然不行,所以要优化。
因为每个数都只有5个,所以可以存下来。
对于一个数,只有这些位置是有贡献的,那么树状数组维护最大值就好了。
code:

#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>using namespace std;struct node{    int a[7];    int num;    node(){num=0;}} p[20010];int n;int ans=0,cn[100010],id[100010];int s1[100010],s2[100010];int tr[100010];int lowbit(int x){return x&(-x);}void change(int x,int c){    for(int i=x;i<=5*n;i+=lowbit(i))        tr[i]=max(tr[i],c);}int get(int x){    int re=0;    for(int i=x;i>=1;i-=lowbit(i))        re=max(re,tr[i]);    return re;}int main(){    scanf("%d",&n);    for(int i=1;i<=5*n;i++) scanf("%d",&s1[i]);    for(int i=1;i<=5*n;i++) scanf("%d",&s2[i]);    for(int i=1;i<=5*n;i++)        p[s2[i]].a[++p[s2[i]].num]=i;    for(int i=1;i<=5*n;i++)    {        for(int j=5;j>=1;j--)        {            int x=p[s1[i]].a[j];            int mx=get(x-1);            ans=max(ans,mx+1);            change(x,mx+1);        }    }    printf("%d",ans);}
阅读全文
1 0
原创粉丝点击