随笔分类 -  字符串

摘要:文本生成器 要记住一点,next[now][c]指向的是在now指向的这一节点所表示的字符串S再添加一个字母c所能形成的字符串。有两种可能,①存在S=S+c,②存在SS+c的最长真后缀,也就是说,要再目标串中看有多少模式串,只需要在遍历目标串的时候无脑往后面加字符$ 阅读全文
posted @ 2021-04-16 11:10 caoanda 阅读(245) 评论(0) 推荐(0) 编辑
摘要:自定义哈希 struct custom_hash { static uint64_t splitmix64(uint64_t x) { // http://xorshift.di.unimi.it/splitmix64.c x += 0x9e3779b97f4a7c15; x = (x ^ (x > 阅读全文
posted @ 2020-12-04 15:27 caoanda 阅读(224) 评论(0) 推荐(0) 编辑
摘要:考研路茫茫——单词情结 这个题也是用AC自动机记录状态,然后得到状态转移矩阵。 因为这道题求的是包括词根的,所以我们先得到不包括词根,然后再用总数减去即可得到。 另外需要注意的一点是,长度不超过L,这又跟之前写的那道限定长度的题不同了,需要在矩阵中再添加一列,用于求和,这一列的值全为1,通过,手推即 阅读全文
posted @ 2020-12-03 11:21 caoanda 阅读(130) 评论(0) 推荐(0) 编辑
摘要:DNA Sequence 参考:AC自动机+矩阵快速幂 POJ 2778 先用AC 自动机保存其状态,用end数组标记那些不能到达的点,并且要注意的一点是如果一个病毒串为abcdef,另一个病毒串为aaabcdef,不止是需要标记这两个串,还需要标记aaabcdef和aabcdef,这个可以在进行自 阅读全文
posted @ 2020-11-21 16:14 caoanda 阅读(169) 评论(0) 推荐(0) 编辑
摘要:Catching Cheaters 其实就是把最长公共子序列的 dp 维护的值变为4LCS(C,D)|C||D|的值就好了。 #include<bits/stdc++.h> using namespace std; const int maxn=5005; int dp[maxn][maxn 阅读全文
posted @ 2020-11-19 18:33 caoanda 阅读(116) 评论(0) 推荐(0) 编辑
摘要:AC自动机 求解一个目标串匹配多个模式串的问题 下面模板求解的是有多少种模式串在目标串中出现 // Created by CAD #include <bits/stdc++.h> #define mst(name, value) memset(name,value,sizeof(name)) usi 阅读全文
posted @ 2020-10-16 17:10 caoanda 阅读(123) 评论(0) 推荐(0) 编辑
摘要:F - Mr. Panda and Fantastic Beasts 参考:[acm/icpc2016ChinaFinal][CodeforcesGym101194] Mr. Panda and Fantastic Beasts 后缀自动机 把2~n的串用一个特殊字符串起来,然后对这个新串建后缀自动 阅读全文
posted @ 2020-10-06 15:13 caoanda 阅读(164) 评论(0) 推荐(0) 编辑
摘要:后缀自动机 // Created by CAD #include <bits/stdc++.h> using namespace std; const int maxn=1e6+5; namespace sam{ int len[maxn<<1],link[maxn<<1],Next[maxn<<1 阅读全文
posted @ 2020-09-20 11:29 caoanda 阅读(96) 评论(0) 推荐(0) 编辑
摘要:后缀自动机做题技巧 ①后缀自动机的总状态数小于2n,总转移边数小于3n ②后缀自动机沿着 link 链接跳的总复杂度为O(n),构造后缀自动机的总复杂度也是O(n) 性质: ①插入字符新增子串数:len[p]-len[link[p]] ②后缀链接:link[p]表示的字符串是p的后缀 阅读全文
posted @ 2020-09-19 09:55 caoanda 阅读(152) 评论(0) 推荐(0) 编辑
摘要:SP1811 LCS - Longest Common Substring 用 sam 进行字符串匹配,建 s 的 sam,然后用 t 在 s 的 sam 上进行匹配,匹配过程中,沿着 Next 转移往下走,如果失配,则沿着 link 链接往上跳,因为 link 链接是该节点的后缀,所以这样跳就不会 阅读全文
posted @ 2020-08-19 14:41 caoanda 阅读(120) 评论(0) 推荐(0) 编辑
摘要:P3975 [TJOI2015]弦论 一定要记得初始化! 后缀链接连接的节点所表示的字符串是该节点表示字符串的后缀,先将所有新增节点的dp[i]都置为1(除了拆点),一个节点所表示字符串的出现次数是其子树所有dp值之和(下标不同,本质相同的两个串是不同串) 如果下标不同,本质相同的两个串属于一个串的 阅读全文
posted @ 2020-08-18 11:03 caoanda 阅读(121) 评论(0) 推荐(0) 编辑
摘要:回文自动机做题技巧 ① 灵活利用维护的各个数据: 节点x len[x]表示该节点表示的字符串的最长长度 fail[x]指向的节点表示的字符串是节点x表示字符串的最长子回文串 cnt[x]在经过以下处理后表示在s中该节点所表示字符串在s中的出现次数 for(int i=sz;i>=0;++i) cnt 阅读全文
posted @ 2020-08-17 09:44 caoanda 阅读(131) 评论(0) 推荐(0) 编辑
摘要:最小表示法 参考:最小表示法 目的:O(n)求出一个序列循环同构中最小的那一个(在字符串中表示为字典序最小的一个循环同构) 优化内容:i,j 分别是当前比较的起始下标,k 是已比较的个数。当前假设Ai+k>Bj+k,那么对于i+p(ii+pi+k)起始的字符串,$ 阅读全文
posted @ 2020-08-16 16:44 caoanda 阅读(205) 评论(0) 推荐(0) 编辑
摘要:1001 Tokitsukaze, CSL and Palindrome Game 比较字典序的时候考虑树上倍增,用树上倍增的时候要保证路径相同,所以把路径哈希一下,直接比较即可 但是当我把maxn开到1e5+5的时候很奇怪的就wa了,开到1e5+20才过 // Created by CAD #in 阅读全文
posted @ 2020-08-16 09:57 caoanda 阅读(263) 评论(0) 推荐(0) 编辑
摘要:回文自动机 参考: 回文树 // Created by CAD #include <bits/stdc++.h> #define ll long long using namespace std; const int maxn=3e5+5; namespace pam{ int sz,tot,las 阅读全文
posted @ 2020-07-29 16:22 caoanda 阅读(107) 评论(0) 推荐(0) 编辑
摘要:P3649 [APIO2014]回文串 根据后缀链接,形成的回文树,对于每一个节点,其子树大小(包括该节点)即为该回文串的出现次数。 // Created by CAD #include <bits/stdc++.h> #define ll long long using namespace std 阅读全文
posted @ 2020-07-29 16:10 caoanda 阅读(113) 评论(0) 推荐(0) 编辑
摘要:C. Count New String 参考:Count New String(广义SAM) 把所有的字符串都存进去,然后再求出不同的子串个数即可。 // Created by CAD #include <bits/stdc++.h> #define ll long long using names 阅读全文
posted @ 2020-07-26 14:33 caoanda 阅读(156) 评论(0) 推荐(0) 编辑
摘要:P3804 【模板】后缀自动机 (SAM) 参考: 不同子串个数 用d[i]来表示该状态点是否为终止点,最后利用每个点的后缀链接形成一棵树,每个点所表示的最长字符串都是其子树中各节点的最长公共后缀。 // Created by CAD #include <bits/stdc++.h> using n 阅读全文
posted @ 2020-07-26 13:58 caoanda 阅读(155) 评论(0) 推荐(0) 编辑
摘要:字典树 字典树比较普通字符串比较而言,字符的可操作性更强 const int maxn=5e5+5; //maxn为总结点个数,不是总深度 struct trie{ int nex[maxn][26],cnt=0; bool exist[maxn]; void insert(string s){ i 阅读全文
posted @ 2020-07-21 11:45 caoanda 阅读(117) 评论(0) 推荐(0) 编辑
摘要:于是他错误的点名开始了 直接用字典树维护即可,不过这个题其实直接用map也能过… 字典树: // Created by CAD #include <bits/stdc++.h> using namespace std; const int maxn=5e5+5; struct trie{ int n 阅读全文
posted @ 2020-07-21 09:34 caoanda 阅读(105) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示