CF235C Cyclical Quest(SAM)】的更多相关文章

/* 统计串的出现次数显然可以在自动机上匹配出来即可 但是每次都挨个匹配的话会时间爆炸 那么考虑我们把串复制一份, 然后一起在后缀自动机上跑, 当我们匹配长度大于该串长度的时候强行失配即可 可能会有旋转后相同的串所以开个数组判重 */ #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<iostream> #define ll long l…
题意 给定一个长度为\(n\)的母串 \(q\)组询问 这个串可以旋转(就是把最后一位丢到最前面这样子) 问这个串以及其旋转的串在给定的串中出现了多少次 Sol 旋转就把它复制一遍接在后面 然后就在\(sam\)上匹配 跳\(parent\)树的父亲到最后一个长度大于等于询问串长 然后统计\(size\) 防止重复算,就标记一下这个点是否算过 # include <bits/stdc++.h> # define RG register # define IL inline # define F…
[CF235C]Cyclical Quest(后缀自动机) 题面 洛谷 题解 大致翻译: 给定一个串 然后若干组询问 每次也给定一个串 这个串可以旋转(就是把最后一位丢到最前面这样子) 问这个串以及其旋转的串在给定的串中出现了多少次 显然,串可以旋转,那么考虑在后面再接一份就行了 匹配的话就是后缀自动机的匹配 但是额外的注意一点 如果当前匹配出来的最大长度\(>=len\) 也就是当前串的长度 那么就要跳父亲 因为旋转后可能有相同的串出现 所以要开一个数组记录当前节点是否已经算过答案 #incl…
C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard input output: standard output Some days ago, WJMZBMR learned how to answer the query "how many times does a string x occur in a string s" quickly…
Cyclical Quest \[ Time Limit: 3000 ms\quad Memory Limit: 524288 kB \] 题意 给出一个字符串为 \(s\) 串,接下来 \(T\) 个查询,枚举给出一个 \(t\) 串,求出 \(t\) 的所有循环子串在 \(s\) 串中出现的次数. 思路 对于每个查询串,因为要所有循环的子串,所以可以先把 \(t\) 串在复制一份到末尾,然后去求 \(LCS\). 如果在 \(p\) 节点查询到的 \(LCS==tlen\),那么 \(p\)…
原文链接https://www.cnblogs.com/zhouzhendong/p/CF235C.html 题目传送门 -  CF235C 题意 给定一个字符串 $s$ ,多组询问,每组询问的形式为一个字符串 $T$ ,问 $S$ 有多少个子串与 $T$ 循环同构.(如果 $S$ 有多个相同子串都同构,则算多次) $|S|\leq 10^6,\sum |T|\leq 10^6$ 题解 以后坚决不念诗了!中午作死念诗,下午就被一个傻逼错误续了 3 个多钟头. 做法: 给 $S$ 建一个 SAM…
厚颜无耻的发一篇可能是全网最劣解法 我们发现要求给定的串所有不同的循环同构出现的次数,可以直接暴力啊 因为一个长度为\(n\)的串,不同的循环同构次数显然是不会超过\(n\)的,所以我们可以直接对每一个循环通过分别求一下其出现次数 求其出现次数当然可以交给\(SAM\)来搞了 于是我们把所有的串都插入\(SAM\)里去,但是我们只计算\(S\)串产生的贡献,对于每一个\(T\)串我们要将其倍长之后再插入,这样我们就可以在\(parent\)树上直接树上倍增求出一个循环同构出现次数了 同时为了去重…
Some days ago, WJMZBMR learned how to answer the query "how many times does a string x occur in a string s" quickly by preprocessing the string s. But now he wants to make it harder. So he wants to ask "how many consecutive substrings of s…
[题目链接] http://codeforces.com/contest/235/problem/C [题目大意] 给出一个字符串,给出一些子串,问每个子串分别在母串中圆环匹配的次数,圆环匹配的意思是将该子串拆成两段再首位交换相接的串和母串匹配,比如aaab变成baaa,abaa,aaba再进行匹配. [题解] 根据母串建立SAM,一个字符串在母串中匹配的次数就是|Right(x)|, 我们将子串复制一份,在母串中匹配到的所有长度为大于len的|right|的总和就是答案. [代码] #incl…
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define PLI pair<LL, int> #define ull unsigned long long using namespace std; ; const int inf = 0x3f3f3f3f; c…
传送门 写的时候挺蛋疼的. 刚开始的时候思路没跑偏,无非就是建个SAM然后把串开两倍然后在SAM上跑完后统计贡献.但是卡在第二个样例上就是没考虑相同的情况. 然后开始乱搞,发现会出现相同串的只有可能是由一个串无限拼接构成的串,于是上了个KMP来搞循环串..然后就没有然后了 基本上一直处于改了这个错误后又被另一个错误卡着的状态,后来没办法了,翻题解.. 然后发现只需要在SAM的节点上开个标记就行了... 越学越傻啊... 至于为什么KMP会挂掉..求dalao评论指出 //Codeforces 2…
题意: 给出一个字符串,给出一些子串,问每个子串分别在母串中圆环匹配的次数, 圆环匹配的意思是将该子串拆成两段再首位交换相接的串和母串匹配,比 如aaab变成baaa,abaa,aaba再进行匹配. 题解: 如何求出所有的循环串出现的次数呢? 先将S串放入后缀自动机 把查询串扩大一倍,然后在后缀自动机上去匹配, 只要匹配长度大于子串长度小于2倍子串长度的,必然对应这一种循环串 记录一下 // 每个节点子串出现的次数 统计答案即可 #include <set> #include <map&…
题意:给一个主串和多个询问串,求询问串的所有样子不同的周期同构出现次数和 没有周期同构很简单就是询问串出现次数,|Right| 有了周期同构,就是所有循环,把询问串复制一遍贴到后面啊!思想和POJ1509相似,不要局限于复制主串 然后走的时候维护nowLen 需要支持尾部插入字符(走转移边)和首部删除字符(走parent边)就行了 PS:家里上CF太慢了还是学校网速快 #include <iostream> #include <cstdio> #include <algori…
题意 给出一个字符串s1和q个询问,每个询问给出一个字符串s2,问这个询问的字符串的所有不同的周期串在s1中出现的次数的和. 分析 对于s1建后缀自动机.对于询问的每个字符串s2,我们按照处理循环串的方法,将它长度乘二再复制一遍.然后根据s2在自动机上跑,当长度len=n的时候,就更新答案.因为要求统计的是不同的周期串,所以对于每个状态都需要打一个vis标记. #include <cstdio> #include <cstring> #include <iostream>…
SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模板]后缀自动机 (SAM) 题意简述:求一个字符串 \(s\) 的所有子串长度乘上其出现次数的最大值. 代码还没写过,到时候来补一下. update:尝试只看自己的博客写出代码,然而失败了 >.< update:好家伙,第二次跳 \(p\) 的时候(即把 \((p_i,q)\) 变为 \((p_i…
*在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符串所有后缀的自动机. 它最早在陈立杰的 2012 年 noi 冬令营讲稿中提到. 在2013年的一场多校联合训练中,陈立杰出的 hdu 4622 可以用 SAM 轻松水过,由此 SAM 流行了起来. 一般来说,能用后缀自动机解决的问题都可以用后缀数组解决.但是后缀自动机也拥有自己的优点. 1812.…
SAM练习记录 洛谷 P1368 工艺 其实是最小表示法裸题 倍长后建SAM跑最小的边走|S|步即可 Code CF 235 C. Cyclical Quest 对主串建SAM 然后每个串倍长,跑的时候维护一下匹配长度再更新答案,还有判断一个节点是否重复到达. Code BZOJ1396: 识别子串 一开始写这个题的时候固执的认为是线段树合并.. 显然出现次数为1的串的rigit集合大小为1,我们直接处理一下就好了,设Ta和Ta父亲的长度是\(len_x\)和\(len_p\) 那么在区间\([…
*在学习后缀自己主动机之前须要熟练掌握WA自己主动机.RE自己主动机与TLE自己主动机* 什么是后缀自己主动机 后缀自己主动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造.可以接受一个字符串全部后缀的自己主动机. 它最早在陈立杰的 2012 年 noi 冬令营讲稿中提到. 在2013年的一场多校联合训练中,陈立杰出的 hdu 4622 能够用 SAM 轻松水过.由此 SAM 流行了起来. 一般来说.能用后缀自己主动机解决的问题都能够用后缀数组解决.可是后缀自己…
解决子串相关问题的强大工具 我们知道一个长度为 \(n\) 的字符串中所有的子串数目为 \(O(n^2)\) 个,这很大程度上限制了我们对某些子串相关问题的研究.所以有没有解决方案,使得我们可以在可承受的复杂度内表示出所有的子串? 于是,一种被称作 \(\text{DAWG}\) 的自动机(字符串 \(s\) 的 DAWG 简称 \(\text D_{s}\))横空出世.它可以做到仅用 \(O(n)\) 的状态数或转移数,表示出 \(s\) 的所有子串,并且 DAWG 可以在线性时间内增量构造.…
A. Boy or Girl 模拟题意. B. Easy Number Challenge 筛素数,预处理出\(d_i\). 三重循环枚举. C. LCM Challenge 打表找规律. 若\(n\)为奇数,则答案为\((n-2)(n-1)n\). 若\(n\)为偶数,则答案为\(max((n-3)(n-2)(n-1),(n-2)(n-1)n)\) D. Let's Play Osu! \[\prod_{i=l}^{r}{p_i}\cdot (r-l+1)^2\]相当于\([l,r]\)之间任…
正题 题目链接:https://www.luogu.com.cn/problem/CF235C 题目大意 一个文本串\(s\).询问\(n\)个匹配的本质不同的循环同构在文本串中出现了几次. 解题思路 我们匹配完原串之后,相当与每次在头部删去一个字符然后又在末尾加上一个字符.使用\(SAM\)匹配的话,发现每次在\(parents\)树上条就相当于删去头部的字符,因为\(parents\)树上的祖先是属于同一个\(endpos\)类的,所以后面的字符不会改变,我们一直跳到满足\(L\in [mi…
SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的.对于有限的东西,相较于无限的东西就会具有一些奇妙的性质.最简单的,就是序列扩展成的树每个节点的儿子数是有限的.所以根据这个,从字符串Hash,到KMP,再到Suffix Array,Suffix Automaton,纷纷诞生. 后缀数组在处理字符串上相当于一把好钢,他能应付在字符串的大多数问题.那么…
SAM感觉写起来比SA更直观(?) #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #define ll long long #define N 600005 using namespace std; inline int read(){ int ret=0…
当测序得到的fastq文件map到基因组之后,我们通常会得到一个sam或者bam为扩展名的文件.SAM的全称是sequence alignment/map format.而BAM就是SAM的二进制文件(B取自binary). 那么SAM文件的格式是什么样子的呢?如果你想真实地了解SAM文件,可以查看它的说明文档.SAM由头文件和map结果组成.头文件由一行行以@起始的注释构成.而map结果是类似下面的东西: HWI-ST1001:137:C12FPACXX:7:1115:14131:66670…
King's Quest Time Limit: 15000MS Memory Limit: 65536K Case Time Limit: 2000MS Description Once upon a time there lived a king and he had N sons. And there were N beautiful girls in the kingdom and the king knew about each of his sons which of those g…
后缀自动机一·基本概念 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称SAM).对于一个字符串S,它对应的后缀自动机是一个最小的确定有限状态自动机(DFA),接受且只接受S的后缀. 小Hi:比如对于字符串S="aabbabd",它的后缀自动机是: 其中红色状态是终结状态.你可以发现对于S的后缀,我们都可以从S出发沿着字符标示的路径(蓝色实线)转移,最终到达终…
Name Quest time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output A Martian boy is named s — he has got this name quite recently from his parents for his coming of age birthday. Now he enjoys loo…
找寻了多天,终于找到了,记录下,以后重装用.输入所有组件的licenses后,提示要注册,我选择了Canada,Google了一个地方的PostCode和phone number,填写,注册成功! 软件下载:(这个我没有安装,不知道包不包含Sql server等) http://www.quest.com/Downloads_Q ... /SetupQCDB5.0.1.exe site message:Quest Free to Our Chinese下面列出参考注册码(对应于上面的site m…
在SAM输出的结果中每一行都包括十二项通过Tab分隔,从左到右分别是: 1 序列的名字(Read的名字) 2 概括出一个合适的标记,各个数字分别代表 1     序列是一对序列中的一个 2     比对结果是一个pair-end比对的末端 4     没有找到位点 8     这个序列是pair中的一个但是没有找到位点 16   在这个比对上的位点,序列与参考序列反向互补 32   这个序列在pair-end中的的mate序列与参考序列反响互补 64   序列是 mate 1 128 序列是 m…
这算是第二讲了,前面一讲是:Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶 MD是mismatch位置的字符串的表示形式,貌似在call SNP和indel的时候会用到. 当然我这里要说的只是利用它来计算mismatch的个数 MD = line.get_tag('MD') pat = "[0-9]+[ATGC]+" MD_list = re.findall(pat,MD) for i in MD_list: for j in i: if j == '…