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