首页 > 其他分享 >矩阵哈希

矩阵哈希

时间:2023-11-07 11:22:22浏览次数:29  
标签:map 那么 frac 哈希 矩阵 bmatrix

矩阵哈希

矩阵哈希可以解决一系列消消乐问题,即:

给定一个序列 \(A\) ,每次可以消除相邻相同两项,问是否可以消除完。

这一类问题。

做法

我们对每个字符 \(c\) 随机一个矩阵 \(M_c\),那么当出现奇数次的时候乘 \(M_c\) ,出现偶数次的时候乘他的逆 \(M_c^{-1}\) 。那么当一个序列里的所有数按顺序乘起来为 \(I\) 的时候,此时这个序列就可以被消掉了。

这个看起来很傻卵,为啥不能用数呢?

容易发现矩阵和数的最大区别就是不具备交换律。

具体地例子是:

\(ABAB\) ,这个在矩阵的时候是 \(M_A\cdot M_B\cdot M_A^{-1}\cdot M_B^{-1}\), 很显然乘起来并不是 \(I\) ,但是当他是数的时候就寄了。

这时候我们就知道矩阵的牛逼之处了:

由于不具备交换律,那么此时由于只具有结合律,这种类似括号匹配的事情就可以轻松处理。

更多的,我们可以设置 \(M_c=M_c^{-1}\),这样就不用考虑奇偶了。

我们设 \(|M_c|=D\) ,那么

\({\begin{bmatrix}a,b\\c,d\end{bmatrix}}^{-1}=\begin{bmatrix}\frac{-d}{D},\frac{b}{D}\\\frac{c}{D},\frac{-a}{D}\end{bmatrix}\)

只要满足 \(D=1\), \(a+d=0\) 即可。

随机出 \(a\) 和 \(b\) ,那么 \(d=-a\) ,\(c=\frac{ad-1}{b}\) 。

具体的,我们来看一些例题

CSP-S2023 T2:

问有多少连续子串可以被消空。

那么从前往后计算前缀和,只要记录有多少个 \(sum_j=sum_i^{-1}\) 即可,这个直接扫一遍 map 存一下就行。

存 map 只要定义 \(<\) 和 \(=\) 即可。

模拟T4:

求有多少种方案可以使得交换不同的两个字符使得最后可以被消除。

一种复杂度更劣的做法是考虑 cdq 分治:

那么枚举交换的是哪个字符,计算出左端点前面的值和到 mid的值,用 \(map\) 存一下,再考虑右端点就行。

这样复杂度是 \(O(n\log^2n)\) 。

另一种更优的方法是:

直接考虑从后往前扫,那么每次新加一个字符相当于对目前的 \(map\) 整体在右乘一个矩阵,用一个 tag 维护一下就行。插入新矩阵就先右乘一下逆即可。复杂度是 \(O(n\log n)\)。

Flower's Land

这个好像才是刚开始的出处?(是花花的题好像

两种操作,一种是区间值域右移:\(a_i=(a_i+1)\mod 3\),另一种是问区间是否可以被消除。

做法就考虑线段树,提前维护好线段树上每个区间右移时候的值,那么只要修改 tag 就行了。

询问是简单的。

标签:map,那么,frac,哈希,矩阵,bmatrix
From: https://www.cnblogs.com/hawkrad/p/17814630.html

相关文章

  • 算法刷题记录-螺旋矩阵
    算法刷题记录-螺旋矩阵螺旋矩阵给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]示例2:输入:n=1输出:[[1]]思路,这题有点绕,我用了一个比res大2的布尔矩阵来存储......
  • 类哈希计数
    1.CountingRoads-AtCoderabc061_b-VirtualJudge(vjudge.net)利用数组的值去替换数组的下标来简化计数过程1#include<bits/stdc++.h>2usingnamespacestd;34intn,m,a[51],b[51],c[51]={0};56intmain(){7cin>>n>>m;8for(int......
  • 树哈希
    树哈希用于解决树同构问题树同构对于两个树\(T_1\)和\(T_2\),如果能够把树\(T_1\)的所有点重新标号,使得树\(T_1\)和树\(T_2\)完全相同,那么这两个树是同构的。也就是说,它们具有相同的形态方法将子树大小等信息进行哈希用unsignedlonglong自然溢出......
  • java基础:再哈希法解决哈希冲突代码示例
    再哈希法(Rehashing)是解决哈希冲突的另一种方法。它与开放定址法不同,再哈希法使用多个哈希函数来确定冲突元素的位置,而不是在同一个哈希表中进行探测。下面是一个使用再哈希法解决哈希冲突的示例代码:publicclassRehashingHashTable{privateEntry[]table;privateint......
  • 字符串哈希
    算法原理:将一个字符串看成是一个P进制的数字。代码模板:def__init__(self,s):n=len(s)self.BASE=BASE=131#进制131,131313self.MOD=MOD=10**13+7#10**9+7,998244353,10**13+7self.h=h=[0]*(n+1)......
  • 线性代数 · 矩阵 · Matlab | 满秩分解代码实现
    背景-矩阵的满秩分解:若A为m×n矩阵,rank(A)=r,则存在Fm×r、Gr×n,使得A=FG。其中,F列满秩,G行满秩。求满秩分解的方法:得到A的行最简形式B;对于B里某列为1该列中其他元素为零的列,取A的对应列,组成F;取B的前r行组成G。function[F,G]=fullra......
  • 【数值分析】向量和矩阵的范数
    向量范数一范数:\(||x||_1=|x_1|+|x_2|+\dots+|x_n|\)二范数:\(||x||_2=\sqrt{|x_1|^2+|x_2|^2+\dots+|x_n|^2}\)p范数:\(||x||_p=\sqrt[p]{|x_1|^p+|x_2|^p+\dots+|x_n|^p},\quadp\in[1,\infty)\)\(\infty\)范数:\(||x||_p=\max......
  • AI问答:关于字符串匹配算法的区别及应用场景,哈希/kmp/字典树/AC自动机
    1. 哈希(Hashing):哈希是一种将字符串转换为唯一标识符的技术,通常用于字符串的快速查找和比较。实现难度相对较低,但需要处理哈希冲突的问题。哈希在处理大量数据的查找和比较问题时非常实用。2. KMP(Knuth-Morris-Pratt):KMP 是一种用于字符串匹配的算法,特别适用于查找子串在主串中的......
  • 如何更新哈希映射中给定键的值?
    内容来自DOChttps://q.houxu6.top/?s=如何更新哈希映射中给定键的值?假设我们在Java中有一个HashMap<String,Integer>。如何更新(递增)我找到的每个字符串键的整数值?人们可以删除并重新输入键值对,但担心会有性能问题。另一种方法是只插入新的键值对,旧的将被替换。在后一种......
  • c++实现哈希桶
    闭散列的回顾在前面的学习中我们知道了闭散列的运算规则,当两个数据计算得到的位置发生冲突时,它会自动的往后寻找没有发生冲突的位置,比如说当前数据的内容如下:当插入的数据为33时计算的位置为3,可是位置3已经被占领了并且4也被占领了,但是位置5没有被占领所以插入数据33就会占领位置5,......