随笔分类 -  字符串

摘要:回文自动机 基础操作 两个初始状态一个长度为 \(0,-1\) 的偶回文根和奇回文根。 转移 \(\delta(x,c)\) 从 \(x\) 节点代表的回文串转移到两端加入字符 \(c\) 后到达的节点。 \(fail(x)\) 指针,指向自身的后缀最长回文串。特殊地,偶回文根指向奇回文根,奇回文根 阅读全文
posted @ 2022-11-08 21:34 cbdsopa 阅读(82) 评论(1) 推荐(0)
摘要:前置知识 基数+计数排序 后缀排序 不考虑暴力了,直接搞上正解。 我们设 \(sa[i],rk[i]\) 分别表示第 \(i\) 名的子串初始点在哪,以及以 \(i\) 开头的子串的排名。 我们考虑倍增的做法。先将长度为 \(1\) 的子串排序求出。 然后每次倍增长度,设长度为 \(w\),然后我们 阅读全文
posted @ 2022-08-11 21:01 cbdsopa 阅读(65) 评论(0) 推荐(0)
摘要:KMP 第一次接触 \(border\) 都是先从 KMP 开始的吧。 思想在于先对于一个串自匹配以求出 fail 指针(也就是 border) 然后就可以在匹配其他串的时候非常自然的失配转移。在此顺便给出一下 \(border\) 的定义: Border 字符串的某个能与后缀完全匹配的真前缀(即不 阅读全文
posted @ 2022-04-04 00:45 cbdsopa 阅读(492) 评论(0) 推荐(0)
摘要:前置知识 基数+计数排序 后缀排序 不考虑暴力了,直接搞上正解。 我们设 \(sa[i],rk[i]\) 分别表示第 \(i\) 名的子串初始点在哪,以及以 \(i\) 开头的子串的排名。 我们考虑倍增的做法。先将长度为 \(1\) 的子串排序求出。 然后每次倍增长度,设长度为 \(w\),然后我们 阅读全文
posted @ 2022-03-07 00:22 cbdsopa 阅读(65) 评论(0) 推荐(0)
摘要:简单的东西就简单说说把,实际上就是一棵树,每条边上有一个字符,然后一个点代表的字符就是根到达它的路径上的字符按遍历顺序组成的字符串。 #include<bits/stdc++.h> using namespace std; int n,m; int edge[500010][26],tot; int 阅读全文
posted @ 2022-02-24 11:53 cbdsopa 阅读(85) 评论(0) 推荐(0)
摘要:思想:把字符串变成数值比较。 我们选取这个 hash 公式: \[hash(s)=\sum_{i=1}^{len} s_i\times p^{len-i}(mod\ M) \]hash方法 自然溢出hash 我们使用 unsigned long long hash[N]; (\(hash[k]\)) 阅读全文
posted @ 2022-02-24 11:52 cbdsopa 阅读(99) 评论(0) 推荐(0)
摘要:手动模拟出奇迹 #include<bits/stdc++.h> using namespace std; inline int read(){ int s=0,f=1; char ch=getchar(); while(ch<'0'||'9'<ch) {if(ch=='-') f=-1;ch=get 阅读全文
posted @ 2022-02-24 11:52 cbdsopa 阅读(49) 评论(0) 推荐(0)
摘要:AC自动机 其实是trie树的改图。每次状态转移在末尾增添一个字符。 其使用失配指针 \(fail\) 指向自动机中自己的最长后缀,以达到多模匹配的效果。 模板题 代码: 其实也不多说了,就是trie加一个fail指针。 其中fail指针如何求?我们遍历全图,当遍历到一条链的第二个点时,我们在初始状 阅读全文
posted @ 2022-02-24 11:51 cbdsopa 阅读(33) 评论(0) 推荐(0)
摘要:简单说一下,首先我们类似扩展KMP一样的维护右端点最右的区间。我们直接把当前的点放到这个最右区间内翻转,直接用这个翻转的位置更新回文长度,然后由于不能保证区间外的回文性,于是取个min,具体看代码。 然后为了统一处理奇偶回文,我们在字符直接以及字符串开头结尾添加 # ,代表空。那么对于一个偶数 \( 阅读全文
posted @ 2022-02-24 11:50 cbdsopa 阅读(100) 评论(0) 推荐(0)