
------------字符串相关-------------
Lynstery
一只蒟蒻
展开
-
[矩阵乘法+KMP] BZOJ1009: [HNOI2008]GT考试
题意阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。 他的不吉利数学A1A2…Am(0<=Ai<=9)有M位,不出现是指X1X2…Xn中没有恰好一段等于A1A2…Am。可以有前导0。 求不出现不吉利的数字的方案数。 N<=1e+9 M<=20题解考虑到之前求方案数比较难求,肯定需要递推求解。 注意到在准考证号中找不吉利数字有原创 2017-02-20 19:57:07 · 866 阅读 · 0 评论 -
SAM 后缀自动机——学习笔记
什么是后缀自动机(SAM)?大概可以理解成对暴力在字母树中插入n个后缀的一种优化。 首先它是一个自动机。 对于一个字符串 sss , SAMSAMSAM 能识别其所有的后缀。还有一系列扩展运用。一些分析和证明用 ST(st)ST(st)ST(st) 表示在自动机中从初始状态沿着字符串st走到达的状态。 字符串 ST(a)ST(a)ST(a) 能识别xxx , 当且仅当 axa...原创 2017-07-25 11:08:52 · 686 阅读 · 0 评论 -
[SAM] POJ1509 Glass Beads
题意给定n,求最小循环子串的开头位置。 若有多个答案,输出开头位置最小的。 n<=10000题解SAMSAM 最水的模板题。 把串复制一段接在后面,然后在SAM上走,每次选标号最小的边走,走n步就达到了答案状态。 我们还需要输出位置。就相当于求子串在原串中首次出现位置,这个问题我们可以对每个状态维护 RightRight 集合的最小元素来解决。#include<cstdio>#includ原创 2017-07-26 16:12:41 · 446 阅读 · 0 评论 -
[SAM] hihoCoder1445 后缀自动机二·重复旋律5
题意给出一个只含小写字母的串 ss ,求 ss 的不同的子串总数。 |s|≤1000000|s| \le 1000000题解SAMSAM 最水的模板题。 直接建出 SAMSAM ,把所有状态的 max(A)−min(A)+1max(A)-min(A)+1 全部加起来即是答案。应该不需要解释。 实现的话可以在 ExtendExtend 过程中维护,这样写比较有价值。 #include<cstd原创 2017-07-26 23:05:27 · 847 阅读 · 0 评论 -
[SAM] Spoj1811 LCS - Longest Common Substring
题意求两个串 s1s1 , s2s2 的最长公共子串。 |s1|,|s2|≤250000|s1|,|s2| \le 250000题解SAMSAM 模板题。 先建出 s1s1 的 SAMSAM ,然后把 s2s2 放上去跑。 考虑当且处理到第 ii 位,若 pp 出发有标号为 s2[i]s2[i] 的边,就直接走,该阶段答案为上次加 11 . 若没有标号为 s2[i]s2[i] 的边,就走 p原创 2017-07-27 23:48:24 · 464 阅读 · 0 评论 -
[贪心+Trie] Codeforces #566A. Matching Names
首先考虑直觉的贪心,每次找 LCPLCP 尽量长的配对。是否正确呢? 考虑 aa 和 bb 的 LCPLCP 较长,cc 和 dd 较短,如果我们互换组合,一定不会使答案增大,所以大概可以感受到贪心是对的。 接下来就是实现的问题了。容易想到 TrieTrie。我们可以从叶往根合并,中途进行匹配。#include<cstdio>#include<iostream>#include<algori原创 2017-10-19 14:57:35 · 455 阅读 · 0 评论 -
[杂题] Codeforces #598B. Queries on a String
简单题。直接考虑原来的某个位置的元素最后到了哪里….O(nm)O(nm)#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=10005,maxm=305;int n,m,L[maxm],R[maxm],rd[maxm];char s[maxn],res[maxn];原创 2017-11-08 20:36:36 · 374 阅读 · 0 评论 -
[KMP fail树] BZOJ3670: [Noi2014]动物园
题目要求的 numinum_i 就等于 failfail 树中 ii 的满足编号 ≤⌊i2⌋ \le \lfloor \frac i 2\rfloor 的祖先的最大深度。 如何求 numinum_i 呢?其实暴力一点的话把 failfail 树建出来倍增肯定是可以的。实际上可以做到线性。 求 numinum_i 可以用类似求 nxtnxt 数组的方法,应该有 numi+1<=numi+1num_原创 2017-11-02 22:22:19 · 324 阅读 · 0 评论 -
[KMP] Codeforces #631D. Messenger
首先要把相同的缩到一起,然后考虑就是一个简单的匹配。 注意到b串两端的字符在a串里匹配可能比a串里那一块少。解决办法就是先把b的两端扣掉匹配,每次匹配成功时判断一下就好了。#include<cstdio>#include<algorithm>#define Fir first#define Sec second#define mp(x,y) make_pair(x,y)using nam原创 2017-10-26 16:40:16 · 368 阅读 · 0 评论 -
[KMP fail树] 51nod1277 字符串中的最大值
题意对于一个字符串 SS,定义 SS 的一个前缀的权值为:前缀长度×\times 在S中的出现次数。求最大权值。 题解failfail 树的简单运用。 一个点所代表的前缀的出现次数=在 failfail 树上以这个点为根的子树大小。 #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const原创 2017-08-02 00:05:57 · 444 阅读 · 0 评论 -
[hash+随机] 2017 计蒜之道初赛第五场UCloud 的安全秘钥
题意给出一个长度为 nn 的串 ss,每次询问求给出串tt,求 ss 的子串中与 tt 近似匹配 的个数。 定义 aa 与 bb 近似匹配: 1.∣a∣=∣b∣∣a∣=∣b∣,即 aa 串和 bb 串长度相等。 2.对于每种数字 xx,xx 在 aa 中出现的次数等于 xx 在 bb 中出现的次数。 n≤50000,∑|t|≤100000 n \le 50000, \sum |t| \le原创 2017-08-01 16:15:10 · 431 阅读 · 0 评论 -
KMP——模板整理
用于字符串匹配问题。 时间复杂度O(n+m)#include<cstdio>#include<cstring>char a[100005],b[100005];int nxt[100005],len1,len2;void make_nxt(){ nxt[1]=0; int j=0; for(int i=2;i<=len2;i++){ while(j&原创 2017-02-21 19:55:59 · 506 阅读 · 0 评论 -
后缀数组之倍增算法——学习笔记
什么是后缀:一个字符串从某位开始到其末尾的子串。 什么是后缀数组:一个字符的所有后缀从小到大排列所形成的的数组。 后缀数组可以解决很多的字符串问题,本文主要写的是构造后缀数组的倍增算法。 暴力构造:直接把n个后缀排序,因为比较字符串需要O(n)O(n)的时间,所以总复杂度O(n2log2n)O(n^2log_2n)。 这样完全没有利用到n个元素都是某一字符串的后缀这个特性,如何改进呢? 倍原创 2017-02-27 19:33:45 · 840 阅读 · 0 评论 -
AC自动机——学习笔记
什么是自动机是一种数学模型,大概就是由一堆状态和状态转移规则等东西构成,能与外界交换信息,并改变动作。 这个是理论上的东西,了解就行,对AC自动机的理解没有大影响。什么是AC自动机?通俗的讲就是在Trie上做kmp,处理多模式串匹配问题。 Trie 的每个结点就是一个状态,根结点是初始状态。 AC自动机的行为被定义为一下3个函数: 1. next函数 ch(q,a):返回从当前状态q走值为a原创 2017-03-07 20:32:18 · 471 阅读 · 0 评论 -
[AC自动机 + DP] BZOJ1030: [JSOI2007]文本生成器
题意给出n个单词。若一个字符串至少包含一个单词,就称这个字符串是”可读的”。 求长度为m的”可读的”字符串个数。所有字符都在[A,Z]范围。 n,m<=100题解首先一步转化,我们从补集考虑统计ans表示一个单词都不包含的串数,则答案为m26−ansm^{26}-ans。 多串匹配问题肯定要想到AC自动机。 我们要求的是长度为m的字符串没有匹配任何串的方案数。 长度对应AC自动机上走的次数原创 2017-05-01 20:10:40 · 498 阅读 · 0 评论 -
Manacher算法——学习笔记
什么是manachar?Manachar算法大概就是可以O(n)求出一个串的最长回文子串。名字听起来很高端,但实际上想法和实现都很简单。 主要思想就是充分了利用回文串的对称性,使复杂度降至O(n)。算法实现具体如何搞呢? 1. 先对原创进行一次预处理,在头和尾以及相邻字符中间都插入一个无关字符,例如: 原串:adcdad 新串: #a#d#c#d#a#d# 这样搞就不必分类讨论回文串长原创 2017-05-13 16:51:30 · 507 阅读 · 0 评论 -
[Trie树] BZOJ3689: 异或之
题意给定n个非负整数A[1], A[2], ……, A[n]。 对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n-1)/2个新的数。求这些数(不包含A[i])中前k小的数。 n<=100000题解有关Trie与二进制的一些运用之前完全不会,现在补一下。 我们可以把所以数字从高位开始插到Trie里,根据每个节点维护的size, 就原创 2017-07-13 17:03:12 · 518 阅读 · 3 评论 -
[可持久化Trie] BZOJ3261: 最大异或和
题意给定一个非负整数序列 {a},初始长度为 N。 有 M个操作,有以下两种操作类型: 1 、A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1。 2 、Q l r x:询问操作,你需要找到一个位置 p,满足 l<=p<=r,使得: a[p] xor a[p+1] xor … xor a[N] xor x 最大,输出最大是多少。 n<=300000题解用容斥转换一下,设原创 2017-07-13 21:51:16 · 676 阅读 · 0 评论 -
[Trie] BZOJ4896: [Thu Summer Camp2016]补退选
题意X是T大的一名老师,每年他都要教授许多学生基础的C++知识。在T大,每个学生在每学期的开学前都需要选课,每次选课一共分为三个阶段:预选,正选,补退选;其中”补退选”阶段最忙碌。在补退选阶段,学生即可以选课,也可以退课。 对于X老师来说,在补退选阶段可能发生以下两种事件: 1:一个姓名为S的学生选了他的课(姓名S将出现在X的已选课学生名单中) 2:一个姓名为S的学生退了他的课(姓名S将从X的原创 2017-06-13 18:54:23 · 393 阅读 · 0 评论 -
[DP+AC自动机] BZOJ1212: [HNOI2004]L语言
直接 DPDP,fif_{i} 表示前 ii 个是否合法。fi|=fi−len(aj)(s[i−len(aj)+1]=aj)f_{i}|=f_{i-len(a_j)}(s[i-len(a_j)+1]=a_j) 用ACAC自动机加速转移的匹配过程。#include<cstdio>#include<queue>#include<algorithm>#include<cstring>using原创 2017-11-26 16:33:05 · 367 阅读 · 0 评论