
字符串
文章平均质量分 78
ez_lcw
这个作者很懒,什么都没留下…
展开
-
【NOI2018】你的名字(后缀自动机,线段树合并)
题意:给定一个字符串 SSS,qqq 次询问 T,l,rT,l,rT,l,r,求 TTT 和 S[l,r]S[l,r]S[l,r] 的本质不同公共子串数目。∣S∣≤5×105|S|\leq 5\times 10^5∣S∣≤5×105,q≤105q\leq 10^5q≤105,∑∣T∣≤106\sum |T|\leq 10^6∑∣T∣≤106。题解:首先看一个弱化版的问题:给出两个串 S,TS,TS,T,求 S,TS,TS,T 的本质不同公共子串数目。由于要求本质不同,所以思路是建出 TTT 的后缀原创 2022-03-02 12:41:12 · 414 阅读 · 0 评论 -
FFT在字符串匹配中的应用
对于一类字符串匹配问题:给定长度分别为 m,nm,nm,n 的字符串 A,BA,BA,B,给出两个相同长度的字符串匹配的定义,要求找出 AAA 在 BBB 中所有匹配的位置。可能能用如下方式解决:定义匹配函数 C(a,b)C(a,b)C(a,b),使得完全匹配函数 P(i)=∑j=0m−1C(Aj,Bi+j)P(i)=\sum_{j=0}^{m-1}C(A_j,B_{i+j})P(i)=∑j=0m−1C(Aj,Bi+j) 等于 000 当且仅当 AAA 和 B[i..i+m−1]B[i..i原创 2022-02-24 10:57:44 · 960 阅读 · 0 评论 -
【XSY3470】Cherry(后缀数组)
题意:给一个长度为 nnn 的串 SSS 和一个长度为 bbb 的串 BBB,有 mmm 个文本串,初始它们都是空串。需要支持 qqq 个操作,每个操作要么是给某个文本串后面接上串 B[l,r]B[l,r]B[l,r],要么是询问某个文本串在 SSS 中的出现次数。题解:一开始的想法是后缀自动机,但 “给一个文本串接上 B[l,r]B[l,r]B[l,r]” 相当于在自动机上走 r−l+1r-l+1r−l+1 步,这个可能比较复杂。考虑使用后缀数组,一个文本串 TiT_iTi 在 SSS 中的出现次原创 2021-12-24 15:53:04 · 345 阅读 · 0 评论 -
如何不重不漏地枚举一个字符串的所有本质不同子序列
给定字符串 SSS,需要实现不重不漏地枚举一个字符串的所有本质不同子序列,其中两个子序列本质不同当且仅当它们所代表的的字符串不同(即不关注下标)。考虑如何判断一个串 TTT 能否成为 SSS 的子序列,我们肯定是从前往后一位一位地用 SSS 匹配 TTT,能匹配就匹配,看最后能不能匹配完 TTT。于是对于每一个位置 iii(0≤i≤n0\leq i\leq n0≤i≤n),枚举字符 ccc,然后向 iii 后面第一次出现字符 ccc 的位置 jjj 连一条边 i→ji\to ji→j(显然建出来的图是一原创 2021-10-18 18:41:16 · 405 阅读 · 0 评论 -
【XSY3458】原样输出(SAM)
考虑判断一个串是否能成为输出,贪心的方法肯定是优先在第一个串的 SAM 上匹配至匹配不了,再在第二个串的 SAM 上匹配至匹配不了,……于是可以考虑通过如下方式把 nnn 个串的 SAM 拼起来:如果一个点没有 CCC 的转移边,那么就要向之后第一个包含字符 CCC 的字符串的后缀自动机接受字符串 CCC 的节点连一条 CCC 的转移边。然后询问就是拓扑排序 DP(type=0)和暴力 dfs(type=1)。#include<bits/stdc++.h>#define N 3000原创 2021-10-18 18:30:41 · 255 阅读 · 0 评论 -
【NOI2016】优秀的拆分(哈希,循环节,分段)
首先可以考虑求出 fif_ifi 表示结尾在第 iii 位的 AAAAAA 串的个数,gig_igi 表示开头在第 iii 位的 AAAAAA 串的个数。枚举 AAA 的长度 LLL,每 LLL 位放置一个关键点,那么 AAAAAA 必定经过恰好两个相邻的关键点。枚举两个相邻关键点 iii 和 i+Li+Li+L 并钦定 AAAAAA 经过这两个关键点,求出 prei,prei+Lpre_{i},pre_{i+L}prei,prei+L 的最长公共后缀 l1l_1l1 和 sufi+1,suf原创 2021-10-15 22:37:40 · 233 阅读 · 0 评论 -
【XSY3955】作曲家(概率dp,生成函数,kmp)
这种序列相似的见过很多次,但一直不会做,今天终于知道一个套路了。记 sss 与 ttt 相似为 s∼ts\sim ts∼t。显然这个 “相似” 是有传递性的,即若 a∼ca\sim ca∼c 且 b∼cb\sim cb∼c,那么 a∼ba\sim ba∼b。前置知识/定义概率相关的定义定义 A‾\overline{A}A 表示事件 “事件 AAA 不发生”。定义 P(A)P(A)P(A) 表示事件 AAA 发生的概率。定义 P(A∣B)P(A|B)P(A∣B) 表示在事件 BBB 发生的前提下(原创 2021-03-29 08:51:36 · 217 阅读 · 0 评论 -
【XSY3905】字符串题(lyndon串,构造)
题面字符串题题解设所有长度不超过 nnn 的串的集合为 SSS。考虑找到一种方法,能够对一个 lyndon 串 AAA ,直接求出 AAA 的下一个 lyndon 串。方法如下:先将 AAA 不断复制, 取出前 nnn 位作为新的 AAA ,即 A←AAA⋯A\leftarrow AAA⋯A←AAA⋯ 的前 nnn 位。如果 AAA 的最后一位是 ′a′+m−1'a'+m-1′a′+m−1,即字符集中最大的字符,则将其删去,一直删除直到最后一位不为 ′a′+m−1'a'+m-1′a′+m−1。原创 2021-02-25 21:39:18 · 190 阅读 · 0 评论 -
字符串小结(持续更新)
只是给忘记模板时的我看的AC自动机大概流程:对所有模式串建出 TrieTrieTrie 树。failfailfail 指针的定义:设 iii 节点所代表的字符串为 SSS,则 failifail_ifaili 表示 SSS 的所有后缀里面,在 TrieTrieTrie 树中出现过的最长的那个串所代表的节点。询问举例:请你分别求出每个模式串 TiT_iTi 在文本串 SSS 中出现的次数。方法:首先先建立 failfailfail 树(faili→ifail_i \to ifaili→i),原创 2020-05-14 13:06:56 · 217 阅读 · 0 评论 -
AtCoder Beginner Contest 164 - D Multiple of 2019
题意:给出一个由数字组成的字符串,让你求这个字符串里有多少个子串是 201920192019 的倍数。很思维的一道题目考虑 [l,n][l,n][l,n] 和 [r,n][r,n][r,n] 模 201920192019 同余 (l≤rl\leq rl≤r)设 x=[r,n]x=[r,n]x=[r,n],k=n−r+1k=n-r+1k=n−r+1,y=[l,r)y=[l,r)y=[l,r),...原创 2020-05-01 11:33:29 · 248 阅读 · 0 评论 -
【XSY2499】字符串(AC自动机+树状数组)
题面DescriptionUPD:本题字符集为全体小写字母InputOutputSample Input51 abc3 abcabc0 abc 3 aba1 abababcSample Output22HINT题解这个“强制在线”好假……法一:我们如果用暴力做法,就是在111和222操作时将字符串强制插入ACACAC自动机修改对应节点的valval...原创 2019-08-14 21:48:22 · 257 阅读 · 0 评论 -
扩展kmp——神奇的字符串匹配
一、引言一个算是冷门的算法(在竞赛上),不过其算法思想值得深究。二、前置知识kmp的算法思想,具体可以参考这篇日报。trie树(字典树)。三、经典扩展kmp模板问题:扩展kmp的模板问题:给你两个字符串s,t,长度分别为n,m。请输出s的每一个后缀与t的最长公共前缀。哈希是不可能的,这辈子都不可能的。AC\mathcal{AC}AC自动机?好像更不可做了。...原创 2019-08-14 21:53:06 · 162 阅读 · 0 评论