JZOJ4721 NlogN的LCS

题意:让你求两个字符串的LCS,n,m<=300000,a[i]<=10^9.
本来我是直接按照普通的nlogn lcs直接打,没想到RE 0了,看了一下数据才知道爆掉了。。a[i]<=10^9,打了个离散化才过。。而且普通的nlognlis会WA,不明觉厉。。
讲解nlognlcs:
。。因为是lcs所以最终的答案串中的每一位一定会在A和B串中出现,所以可以把A中的串投影到B串中,对于B串中不为0的位置做lis就可以了。。
怎么投影呢?假设有i,j使得A[i]=B[j],那么最终需要做lis的数组为C,C[A[i]]=j;
标程(交了18次才A我真是菜哭了。。发现网上的nloglis一但数据大了以后就会WA。。坑我。):

#include <cstdio>
#include <algorithm>
#define maxn 300005
using namespace std;
int n,m,a[maxn],i,j,l,r,mid,ans,f[maxn];
struct pn
{
    int v,p;
};
pn b[maxn];
bool cmp(pn x,pn y)
{
    return x.v<y.v;
}
int find(int v)
{
    l=1;
    r=m;
    while (l<r)
    {
        mid=(l+r)>>1;
        if (b[mid].v>=v)
            r=mid;
        else
            l=mid+1;
    }
    if (b[l].v!=v)
        return -1;
    return b[l].p;
}
int main()
{
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for (i=1;i&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值