首页 > 其他分享 >字符串相关

字符串相关

时间:2024-01-22 22:55:39浏览次数:28  
标签:ch 匹配 int tr 字符串 相关 文本

可持久化 trie 树

基本思想

新加入一个字符串后,继承旧版本对应节点的儿子和其它信息,对字符串的每个字符新建节点。

使用方法

两个版本的 trie 树具有可减性,所以可以在静态问题加上区间、树链限制,完成 trie 树可以做的事,比如最大异或、k 大异或、mex 等。

求解区间最大异或时,可以直接比较新旧版本标号是否相等,如果不相等,说明相减后这棵字数非空。

模板代码

inline void insert(int i, int x)
{
	int u = ++ pid, v = root[i - 1], ch;
	root[i] = u;
	for(int i = K; i >= 0; i -- )
	{
		ch = x >> i & 1;
		tr[u][ch ^ 1] = tr[v][ch ^ 1];
		tr[u][ch] = ++ pid;
		u = tr[u][ch], v = tr[v][ch];
	}
}
inline int query(int u, int v, int x)
{
	int cnt = 0, ch;
	for(int i = K; i >= 0; i -- )
	{
		ch = (x >> i & 1) ^ 1;
		if(tr[u][ch] > tr[v][ch])
		{
			u = tr[u][ch], v = tr[v][ch];
			cnt += 1 << i;
		}
		else u = tr[u][ch ^ 1], v = tr[v][ch ^ 1];
	}
	return cnt;
}

KMP

全是神题。

  • 给定字符串,求每个前缀最长 border。
  • 给定字符串,求周期。
  • 给定模式串和文本串,求每个前缀能匹配到的最长模式串,这里指模式串的前缀与文本串的后缀匹配。这种匹配没有单调性。
  • 给定模式串和文本串,求文本串每个后缀与模式串的 LCP。(Z 函数)这种匹配有单调性。
  • 给定文本串,对文本串进行插入、删除末尾字符的操作,求最长匹配。
    • 一般,next 数组设为前缀最长 border,但真正的 KMP 加上另一个优化:如果 \(s_{i+1}=s_{border_i+1}\),把 \(next_i\) 设为 \(next_{next_i}\),因为直接跳到最长 border,一定会适配。这种算法不太好卡,或者有小常数,但时间复杂度还是 \(O(|S|^2)\) 的快 TLE 去用哈希搞
    • 如果字符集比较小,可以确定当前匹配的状态末尾加上一个字符之后的状态,建立自动机。时间复杂度 \(O(|S||\Sigma|)\),\(\Sigma\) 表示字符集。
    • 如果字符集比较小,可以状压加倍增,时间复杂度 \(O(|S|\log|S|)\)。
    • 如果字符集比较小,或者足够有信心,可以直接哈希。
  • 给定模式串,对文本串进行插入重复字符、删除末尾多个字符的操作,求最长匹配。
    • 跳转次数不会超过 \(|S|\),在自动机上倍增,复杂度 \(O((|S|+q)|\Sigma|\log|S|)\)。
    • 对每种字符的转移,自动机是一个森林,并在树根上连自环,可以树链剖分,复杂度 \(O(|S||\Sigma|+q\log|S|)\)。
    • 考虑一种方法压缩字符串:把每个字符相同连续段压缩成一个元素,记录这段字符的种类和长度,然后匹配出去收尾的部分,特判两边。
    • 用哈希匹配。由于字符集比较大,建议双哈希。
  • 扩展的匹配:重定义字符串相同
    • 对 next 数组,要求 border 相同,实现时加入两个点后字符串相同。
    • 对匹配过程,要求如果文本串的 \(i\) 在模式串 \(j\) 的位置上,则匹配到的串中,文本串的 \(i\) 与模式串的 \(j\) 相同。

最小表示法

你说得对,但是最小表示法是一款短小精悍的字符串算法,用于判断循环同构,流程如下:

  • 将字符串复制一份放后面。
  • 两个指针 \(i,j\) 初始分别为 \(0,1\),记录 \(k\) 表示相同的长度。
  • 如果 \(S_{i+k}=S_{j+k}\) 则 \(k\) 增加。
  • 如果 \(S_{i+k}\ne S_{j+k}\),则把较大的指针设为这个指针加 \(k+1\),\(k\) 设为 \(0\)。
  • 当两个指针相等,任意一个加 \(1\)。
  • 当一个指针大于 \(n\),或 \(k\) 大于等于 \(n\)(说明字符串循环),退出循环。
  • 两个指针较小一个是最靠前的最小表示。

Z 函数与 Manacher

for(int i = 1, r = 0, p = 0; i < n; i ++ )
{
	if(i < r && z[i - p] < r - i) z[i] = z[i - p];
	else
	{
		z[i] = max(0, r - i);
		while(str[i + z[i]] == str[z[i]]) z[i] ++ , cnt ++ ;
		if(i + z[i] > r) r = i + z[i], p = i;
	}
	ans += z[i] + (i + z[i] != n);
}
inline void change()
{
	s[0] = '#', s[1] = '*', m = 1;
	for(int i = 1; i <= n; i ++ )
	{
		s[ ++ m] = str[i];
		s[ ++ m] = '*';
	}
	s[ ++ m] = '$';
}
inline void manacher()
{
	for(int i = 1, p = 0, r = 0; i <= m; i ++ )
	{
		f[i] = i < r ? min(r - i, f[p + p - i]) : 1;
		while(s[i - f[i]] == s[i + f[i]]) f[i] ++ ;
		if(i + f[i] > r) r = i + f[i], p = i;
	}
}

标签:ch,匹配,int,tr,字符串,相关,文本
From: https://www.cnblogs.com/recollect-the-past/p/17981315

相关文章

  • R语言Pearson相关性分析降雨量和“外卖”谷歌搜索热度google trend时间序列数据可视化
    全文链接:http://tecdat.cn/?p=31608原文出处:拓端数据部落公众号GoogleTrends,即谷歌趋势。谷歌趋势是谷歌旗下一款基于搜索数据推出的一款分析工具。它通过分析谷歌搜索引擎每天数十亿的搜索数据,告诉用户某一关键词或者话题各个时期下在谷歌搜索引擎中展示的频率及其相关统计数......
  • 一类垂直弦相关的平面解析几何问题探究
    题目一题文今有椭圆\(\Gamma:\frac{x^2}{a^2}+\frac{y^2}{b^2}=1,(a>b>0)\)点\(A,B\in\Gamma\)并且\(OA\botOB\),求\(O\)到\(AB\)的射影\(H\)的轨迹方程。解法一考虑设\[OA:y=kx,OB:y=-\frac{x}{k}\]先考察斜率存在的情形。联立\(OA,\Gamma\)......
  • Linux开发相关命令整理
    1.反转shell2.ldd3.objdump4.ldconfig5.telnet6.nc7.netstat8.ss9.tcpdump1.反转shell攻击者主机执行:nc-nlvp<port>被攻击者执行:bash-i>&/dev/tcp/<ip>/<port>0>&1也可以用于把局域网下主机终端暴露给公网下,这在特定场景下比较方便2.ldd用于查......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。​<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>......
  • JavaScript DOM表单相关操作之获取表单数据的方式
    在与表单相关的操作中,我们用的最多的就是获取表单中的数据。想要获取指定输入框的数据,首先就需要获取到这个输入框对象。1、通过id属性获取表单数据​<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>输......
  • JavaScript DOM表单相关操作之获取表单数据的方式
    在与表单相关的操作中,我们用的最多的就是获取表单中的数据。想要获取指定输入框的数据,首先就需要获取到这个输入框对象。1、通过id属性获取表单数据<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head>......
  • Modem(调制解调器)相关知识
    调制解调器由发送、接收、控制、接口、操纵面板及电源等部分组成。数据终端设备以二进制串行信号形式提供发送的数据,经接口转换为内部逻辑电平送入发送部分,经调制电路调制成线路要求的信号向线路发送。接收部分接收来自线路的信号,经滤波、反调制、电平转换后还原成数字信号送入数......
  • 17、基于SLF4J中打印日志的方法,实现字符串中{}快速替换需要的内容
    转载自一、String工具类:publicclassStringUtils{privatestaticfinalcharDELIM_START='{';privatestaticfinalStringDELIM_STR="{}";privatestaticfinalcharESCAPE_CHAR='\\';/***基于slf4j中打印日志的......
  • 信创相关名词解释
    1.信创指的是什么在中国,"信创"是“信息技术应用创新”的简称,它是一个国家战略层面的计划,旨在通过自主研发和技术创新,构建基于国产化信息技术软硬件产品的安全可控的信息技术体系。信创任务主要针对的是核心基础软硬件,包括但不限于:操作系统:开发和推广使用国产操作系统,替代对国外......