
sam
文章平均质量分 82
新笑雨
这个作者很懒,什么都没留下…
展开
-
Pty的字符串(string)
解法SAM:首先用trie树建sam,和一般的sam不同的地方在于转移的位置不再是直接用ed,而是根据该节点在trie树上的祖先。然后就是跑LCP操作,统计答案。统计答案时需要计算每个节点所代表的字符串数量val[i]和从根节点到每个节点的val的前缀和sum,然后就可以了,注意统计前缀和的时候需要另一次dfs#include<bits/stdc++.h>using namespace std;const int maxn=2e6+5;#define int long long.原创 2020-05-18 19:25:55 · 238 阅读 · 0 评论 -
luogu 4081
题目链接解法广义SAM:笔者建广义SAM的做法是一个字符串结束之后直接把指针指回根,似乎并不是非常对的做法。。。回到题目:将广义SAM建出来以后,把每个字符串在SAM上跑,每个经过的节点打上标记,如果某个节点只有一个标记,说明只有一个字符串拥有这个节点代表的子串,这些子串就需要加到该字符串的答案中。#include<bits/stdc++.h>using namespace ...原创 2020-03-23 16:54:24 · 129 阅读 · 0 评论 -
一道sam练习题
题意解法考虑答案实际上是每个子串的出现次数的平方和.这个可以通过手玩样例验证.考虑广义sam:先将所有字符串建成trie,然后再在trie上bfs,建出sam.考虑fail树每次插入一个新节点,会改变从这个节点开始到根的路径上的每个节点的right集合大小.所以考虑树剖维护这种操作,然后每一个单词的答案就是之前所有单词的答案,再计算自己的答案,然后注意这里一个线段树节点维护的有...原创 2020-01-17 17:52:55 · 289 阅读 · 0 评论 -
codeforces 700E
题目链接题意给一个字符串S,要求构造字符串序列s1,s2,...,sks_1,s_2,...,s_ks1,s2,...,sk,满足任意s都是S的子串,且任意i∈[2,n],都有sis_isi在si−1s_{i-1}si−1里出现了至少2次,问k最大可以是多少。数据范围∣S∣≤200000|S|\le 200000∣S∣≤200000解法SAM+线段树合并考虑先对原串建出SA...原创 2020-01-14 19:05:56 · 220 阅读 · 0 评论 -
一道sam练习题
题意有两个字符串A,B,求这两个字符串长度大于等于k的公共子串数量数据范围串长≤1e5,∣∑∣小写字母串长\le 1e5 ,|\sum|小写字母串长≤1e5,∣∑∣小写字母解法sam板子题…具体来讲,首先求出A的sam,然后把B串放在上面跑LCS的操作,求出对于B的每个前缀在A上的LCS.然后记下这个LCS的长度和位置.然后做dfs,求出sam上每个节点的贡献就可以了,具体实现看代码...原创 2020-01-06 19:08:30 · 205 阅读 · 0 评论 -
sam备忘
鉴于sam写一次忘一次,在这里记录一下自己对sam的一些小小定义和理解len[i]:i节点所代表的字符串中最长的一个的长度len[i]:i节点所代表的字符串中最长的一个的长度len[i]:i节点所代表的字符串中最长的一个的长度fa[i]:i节点在parent树上的父亲fa[i]:i节点在parent树上的父亲fa[i]:i节点在parent树上的父亲ed:当前可以接收节点的节点编号(类似于新...原创 2019-12-21 11:06:39 · 108 阅读 · 0 评论 -
luogu P4070
题意:在线求一个字符串的本质不同子串个数字符串长度≤1e5\le 1e5≤1e5 字符集大小1e91e91e9解法:sam直接在线插入每个字符,插入的时候考虑新字符的贡献,就是len[p]−len[fa[p]]len[p]-len[fa[p]]len[p]−len[fa[p]],len[p]len[p]len[p]指的是p这个节点所代表的字符串的最长长度.#include<bits/...原创 2019-12-21 10:29:48 · 120 阅读 · 0 评论