首页 > 其他分享 >黑科技:bitset 优化 LCS

黑科技:bitset 优化 LCS

时间:2024-02-04 12:23:21浏览次数:27  
标签:le 匹配 LCS int bitset 优化 dp

感觉挺有参考意义的,单独拎出来发一个。


Loj6564 最长公共子序列

求 \(a,b\) LCS 长度。

\(n,m \le 7\times 10^4\),1s,1GB。

这 \(O(n^2)\) 还能往下卡吗?

可以的,\(O(\frac{n^2}{w})\)。

考虑 \(dp_{i,j}\) 的转移,有 \(0 \le dp_{i,j+1}-dp_{i,j} \le 1\),即差分数组是 01 串,给差分压位吧。

  • 我们现在要匹配 \(a,b\) 两个串。
  • 设 \(f_{i,j}\) 表示 \(a\) 匹配到前 \(i\) 位,\(b\) 匹配到前 \(j\) 位的答案,差分 bitset 为 \(f_i\)。
  • 预处理出每个字符在 \(a\) 中出现的位置组成的 bitset \(g_i\)。
  • 考虑求 LCS 的过程。相当于是我们要尽量匹配前面的字符。
  • 放到 \(f_i\) 里面也就是,对于 \(f_i\) 的每段连续的 \(000\cdots 1\) ,在 \(g_{b_i}\) 的对应区间中找到最靠前的那一个 \(1\),然后把 \(f_i\) 的那个位置变成 \(1\),并把这段区间原本最后的 \(1\) 变成 \(0\),即往前匹配一位。特别地,最后的 \(000\cdots 0\) 也算,只是没有 \(1\) 变 \(0\) 的操作。
  • 这玩意用位运算表示是记 \(X=f_{i-1}\operatorname{or} g_{b_i}\),\(f_i=(X-((f_{i-1}<<1)|1))\operatorname{xor} X \operatorname{and} X\)。
  • 大概解释下意义:
  • 取 lowbit 有这么一种写法:\(\text{lowbit}(x)=(x-1)\text{ xor }x\text{ and } x\)。
  • 因为分了段,不一样的就只是那个 \(x-1\),考虑怎么把对 \(x\) 整个 \(-1\) 变成对 \(x\) 的每一段都单独 \(-1\)。
  • 这是好解决的,因为每一段在 \(f_{i-1}\) 中都以 \(1\) 结尾,右移一位变成每一段开头,再加上最前面的 \(1\) 就可以了。

最后 \(f_n\) \(1\) 的个数即为答案。

然后如你所见,因为带个二进制减法,bitset 要手写……

struct bts {
	using ull=unsigned long long;
	int n;
	ull a[N/64+7];
	bts() { memset(a,0,sizeof(a)); }
	void ini(int _n) { memset(a,0,sizeof(a)); n=_n/64+1; }
	void set(int p) { a[p>>6]|=(ull)1<<(p&63); }
	int cnt(int ret=0) {
		for (int i=0;i<n;i++) ret+=__builtin_popcountll(a[i]);
		return ret;
	}
	void sft() {
		ull flg=0,tmp;
		for (int i=0;i<n;i++)
			tmp=flg,flg=a[i]>>63&1,a[i]=(a[i]^(flg<<63))<<1|tmp;
	}
	friend bts operator & (bts x,bts y) {
		bts ret=x;
		for (int i=0;i<x.n;i++) ret.a[i]=x.a[i]&y.a[i];
		return ret;
	}
	friend bts operator ^ (bts x,bts y) {
		bts ret=x;
		for (int i=0;i<x.n;i++) ret.a[i]=x.a[i]^y.a[i];
		return ret;
	}
	friend bts operator | (bts x,bts y) {
		bts ret=x;
		for (int i=0;i<x.n;i++) ret.a[i]=x.a[i]|y.a[i];
		return ret;
	}
	friend bts operator - (bts x,bts y) {
		bts ret=x; ull lst=0;
		for (int i=0;i<x.n;i++)
			ret.a[i]=x.a[i]-y.a[i]-lst,lst=x.a[i]<y.a[i]+lst;
		return ret;
	}
} f,g[N],tmp;
int mtc(int n,int m,int *a,int *b) {
	f.ini(n),tmp.ini(n);
	for (int i=0;i<N;i++) g[i].ini(n);
	for (int i=1;i<=n;i++) g[a[i]].set(i);
	for (int i=1;i<=m;i++) {
		tmp=f|g[b[i]];
		f.sft(),f.set(0);
		f=((tmp-f)^tmp)&tmp;
	}
	return f.cnt();
}

Gym103652F Square Subsequences

给定一个字符串。求字符串中最长的满足条件的子序列:长度为偶数,且前半段和后半段相同。输出具体结果

\(1 \le \sum n \le 3000\),2s,256MB。

枚举分割点切成两个串再套上面的 LCS 即可。

然后这里会出现一个巨坑:

博主一开始写的时候直接把出来的 \(f\) 中每一个 \(1\) 的位置当成匹配到的位置,然后直接把每一个 \(1\) 上的字符输了出来……

但是根据转移式,每一个 \(1\) 不一定来自同一个 \(f\) 前面的值,还有可能来自已经死去了的 \(f_{i-1}\)……博主因为这一点调了三个小时。

由于这题匹配的串的特殊性,确定了分割点之后再跑一遍朴素 DP 确定答案即可。

理论上你很难在 bitset 里把匹配过程记下来……所以如果要求方案的话还是老老实实写 \(O(n^2)\) DP 罢。如果有会的戳一下博主。

标签:le,匹配,LCS,int,bitset,优化,dp
From: https://www.cnblogs.com/CarroT1212/p/18005954/BitsetOptimizingLCS

相关文章

  • 由亚马逊云科技 Graviton4 驱动的全新内存优化型实例 Amazon EC2 实例(R8g),现已开放预
    下一代 AmazonElasticComputeCloudAmazonEC2) 实例的预览版现已公开 提供。全新的 R8g实例 搭载新式Graviton4处理器,其性价比远超任何现有的内存优化实例。对于要求较高的内存密集型工作负载,R8g实例是不二之选:大数据分析、高性能数据库、在内存中缓存等。亚马逊云......
  • 从CPU100%高危故障到稳定在10%:一个月的优化之旅,成功上线!
    引言经过三个月的开发,项目通过了所有测试并上线,然而,我们发现项目的首页几乎无法打开,后台一直发生超时错误,导致CPU过度负荷。在这次项目开发过程中,我制定了一份详细的技术优化方案。考虑到客户无法提供机器硬件配置,我们只能从软件方面寻找解决方案,以满足客户的预期。同时,我还准备......
  • 关于Windows11的优化内容 - 进阶者系列 - 学习者系列文章
          这几天无事,想起上次刚重装的Windows11操作系统,对于系统优化的内容想记录一下,以前没写过相关的博文,这次就做个记录吧。对于Windows11,已经出来几年了,相关的设置啥的也有,就是优化方面的软件和设置也有相关的,这次就把笔者这边所有相关的优化工具软件和脚本啥的一并发布......
  • 神经网络优化篇:详解Softmax 回归(Softmax regression)
    Softmax回归有一种logistic回归的一般形式,叫做Softmax回归,能让在试图识别某一分类时做出预测,或者说是多种分类中的一个,不只是识别两个分类,来一起看一下。假设不单需要识别猫,而是想识别猫,狗和小鸡,把猫加做类1,狗为类2,小鸡是类3,如果不属于以上任何一类,就分到“其它”或者说“以上......
  • 1.8w 字的 SQL 优化大全
    https://mp.weixin.qq.com/s/JUyNzlJJCSd7AhKU6GVocg 分享一篇关于SQL优化的硬核文章,全文有点长,建议收藏后慢慢看。很多朋友在做数据分析时,分析两分钟,跑数两小时?在使用SQL过程中不仅要关注数据结果,同样要注意SQL语句的执行效率。本文涉及三部分:SQL介绍SQL优化方法S......
  • 如何优化Linux服务器的性能和响应速度?
    Linux服务器是一种常用的服务器操作系统,为了保证系统的稳定和高效运行,优化服务器的性能和响应速度显得尤为重要。如何优化Linux服务器的性能和响应速度?1.系统调整内核参数优化:调整Linux内核参数可以提升服务器的性能。例如,通过修改文件/etc/sysctl.conf来设置TCP/IP相关参数,如增......
  • synchronized【如何保证原子性、可见性、有序性】【如何实现原子性 原理解析】【什么
    @TOC转自极客时间如何解决可见性问题?同步原理剖析什么是Monitor?什么是锁优化?......
  • 优化拼多多关键词搜索接口:提高查询响应速度的技巧
    在电商平台中,关键词搜索接口是用户寻找商品的重要途径。一个高效、快速的搜索接口能够极大地提升用户的购物体验。针对拼多多这样的大型电商平台,优化搜索接口的查询响应速度尤为重要。本文将深入探讨如何通过多种方法来优化拼多多关键词搜索接口。1.使用缓存技术缓存是提升读取速......
  • 20240130-DP以及优化随记
    状态转移方程递归关系(从已知求得未知的表达式)背包dp0-1背包,多重,完全,混合模版套用//多重背包#include<bits/stdc++.h>usingnamespacestd;constintN=507,M=1e5+7;intp,n,x,y,z,dp[10005];intmain(){ cin>>p>>n; for(inti=1;i<=n;i++){ scanf("%d%d......
  • CloudFront分发优化:最佳实践与性能调优
    引言AmazonCloudFront作为AWS的全球内容分发网络(CDN)服务,为用户提供了高效、安全、可扩展的内容传递体验。然而,要确保CloudFront分发能够发挥最佳性能,需要深入了解其配置和优化选项。在本博文中,我们将探讨一系列CloudFront的优化最佳实践,以确保您的内容以最快、最可靠的方式传递给......