
字符串
yzyyylx
这个作者很懒,什么都没留下…
展开
-
CodeForces 913 E. Logical Expression
题面题意 给出x=1111B,y=110011B,z=1010101B,输出一个由x,y,z组成的字符串使其结果为给出的数,且最短,若长度相同,则输出字典序最小的一个.方法 首先按符号的优先级来划分等级: 0 – (),! 1 – & 2 – | dp[i][j]表示优先级为i,值为j时的最优表达式. 因此,dp[0][x]=x,dp[0][y]=y,dp[0原创 2018-01-10 15:17:06 · 480 阅读 · 0 评论 -
CodeChef - GERALD3 Chef and Substrings
题面题意给出一个字符串,每次询问左端点在l,r区间内的字符串一共有几种。做法莫队,那么只要考虑在已知道答案的L-R区间内加入一个或删除一个点的贡献即可。 难点在于去重,如果不考虑重复,那么某个点的贡献就是Len-pos+1.现在考虑重复,可以发现一个点为左端点的字符串就是以它为首的后缀的所有前缀,那么只要求出它与L-R内所有点为首的后缀的LCP的最大值即可。 这里就要用...原创 2018-07-19 09:31:57 · 400 阅读 · 0 评论 -
HDU 4787 GRE Words Revenge
题面题意有2种操作: 1.学习一个字符串(已学过则不算) 2.查询某个字符串中有几个学过了。 强制在线做法如果不用在线,则离线建AC自动机,轻松解决。 但是,题目要求强制在线,可以发现,随着新串的加入,AC自动机上节点的fail指针也会随之改变,因此AC自动机必须重构,但若直接重构必然会T。 因此,可以考虑分块的思想,建两个AC自动机a,b,每次将字符串加入到b中,加...原创 2018-07-25 20:17:25 · 327 阅读 · 0 评论 -
HDU - 4626 Jinkeloid
题面题意每组数据给出一个字符串(仅包含前20个字符),多次询问,每次询问给出k(k<=5)个字符,问给出的字符串中有几个子串含给出的字符都是偶数个(包括0)。做法因为一共只有20种字符,所以考虑状压,但若直接暴力dp求出每种情况的子串数,复杂度为O(|s|*2^20),显然会T。 可以将问题先转换一下,先状压前缀,每个字符串都可以看做是从前缀中选出两个不同位置上的数Xo...原创 2018-07-26 09:41:50 · 590 阅读 · 0 评论 -
CodeForces 86C Genetic engineering
题面题意给出m个字符串,要求构建一个长度为n的母串,要求每个字符都被至少一个子串覆盖,问有几种方案。做法首先肯定要建出AC自动机,因为每个字符都要被覆盖,可以在匹配时不跳fail指针,除非此时恰好在一个子串的最后一位,但是这样显然会有重复,因此要考虑转化方式。 因为子串长度较小,所以可以考虑再加一维,记录此时有几位未被匹配,然后每次判断一下是否可以匹配掉这些的失配的字符。...原创 2018-07-27 11:03:22 · 1047 阅读 · 1 评论 -
bzoj4556 [Tjoi2016&Heoi2016]字符串
题面题意给出一个字符串,每次询问给出四个数a,b,c,d,求子串a~b的所有子串与子串c~d的最长LCP。做法首先可以发现答案有可二分性,因此可以先二分答案,这样问题就转化为了问左端点为a~(b-mid+1)的所有后缀中是否存在一个后缀与以c为左端点的后缀的LCP大于等于mid。 这个可以利用后缀数组来解决,首先二分求出与以c为左端点的后缀的LCP大于等于mid的后缀排名的范...原创 2018-07-28 09:02:04 · 572 阅读 · 0 评论 -
HDU5470 Typewriter
题面题意给出一个字符串,现在你要打印它,你有两种操作: 1.在已打印字符串后面打印一个字符,代价为该字母的代价。 2.选择已打印的字符串的一个子串s,在后面复制粘贴,代价为|S|*A+2*B。做法第一个操作很好处理,难点在于第二个操作。 首先考虑dp[i]表示打印前i个字母所需要的代价,这样dp[i]=min(dp[i-1]+need[i],dp[j]+(i-j)*A...原创 2018-07-28 12:55:58 · 722 阅读 · 0 评论 -
BZOJ4259 残缺的字符串
题面题意给出两个字符串,一个模式串,一个匹配串,问匹配串中哪些位置可以匹配上模式串,其中*可以作任意字符。做法这个可以转化为多项式,我们可以把*看作0,其他字母看作各个数字,然后发现如果两个字符串相同,当且仅当∑i=0n−1(a[i]−b[i])2∗a[i]∗b[i]==0\sum_{i=0}^{n-1}{(a[i]-b[i])^2*a[i]*b[i]}==0∑i=0n−1(a[i]−b...原创 2018-12-31 16:16:09 · 180 阅读 · 0 评论 -
codeforces1110H Modest Substrings
题面题意给出三个数l,r,nl,r,nl,r,n,求出一个由数字组成的字符串,使其所有子串中,符合在[l,r][l,r][l,r]内的数量最多,若有多组解,输出字典序最小的一个。做法首先考虑最朴素的做法,可以将[l,r]内的所有数字当作字符串加入一个AC自动机,直接在上面dp。但是因为l和r极大,因此需要优化。发现当一个数的长度确定,并且某一个前缀也确定之后,无论其后面填什么数,它都在[...原创 2019-02-22 13:46:40 · 263 阅读 · 0 评论 -
2018-2019 ACM-ICPC, Asia East Continent Finals J. Philosophical … Balance
题面题意多组数据,每组数据给出一个长度为n的字符串S,求maxi∑j=1nlcp(i,j)∗kj\max_{i}{\sum_{j=1}^{n}lcp(i,j)*k_{j}}maxi∑j=1nlcp(i,j)∗kj的最小值其中kik_{i}ki由你定,但是要满足∑i=1nki=1\sum_{i=1}^{n}k_{i}=1∑i=1nki=1,且0&amp;amp;lt;=ki&amp;amp;lt...原创 2019-03-05 17:58:26 · 582 阅读 · 0 评论 -
codeforces506E Mr. Kitayuta's Gift
题面题意给你一个长度为n的字符串,现要你加上m个字符,使其变为一个回文串,问有几种加法。做法首先题目可以转化为,求有几个长度为n+m的字符串,使给出的字符串为该字符串的子序列。这样可以考虑从两边开始确定字符,并与给出的字符串进行匹配,然后我们就可以根据此时的字符串已经匹配的位置建立自动机,这个自动机由多个节点构成,每个点都有一个权值为24,25或26(仅终点是26)的自环,然后非自环会形...原创 2019-03-03 13:44:01 · 402 阅读 · 0 评论 -
洛谷 P4595 [COCI2011-2012#5] POPLOCAVANJE
题面题意给出一个字符串S(长度不超过300000)和至多5000个串,用这至多5000个串去覆盖S,每个串允许用多次,且允许串重叠,则S中至少有几个字符不被覆盖。空间限制为64MB做法这题可以用后缀自动机和AC自动机都可以直接做,但是因为空间限制,都不能直接建。但是注意到这5000个字符串相互独立,所以可以进行分块,对约根号个串建出AC自动机后,计算贡献,然后每次再清空重建即可代码...原创 2019-03-13 21:52:57 · 234 阅读 · 0 评论 -
codeforces 1009G Allowed Letters
题面题意给出一个字符串(最多包含 a-f 6个字母),每个位置也都给出一个字符集,现在要求改变其排列的顺序,使其每个位置的字符否是给出该位置上字符集中的一个,输出字典序最小的合法字符串。做法首先想到的肯定是一个一个字符贪心的加入,问题就在于如何判断将一些字符放入剩下的位置,是否存在合法方案。 判断方法是这样的: 枚举所有字符集(2^6个),然后若存在一个字符集,其中还未...原创 2018-07-18 19:01:55 · 445 阅读 · 0 评论 -
AC自动机
作用用于处理多个字符串匹配,例如给出一些关键单词,再给出一篇文章(或多篇),问文章内的出现了几个单词或一共出现了几次.实现方法可以说是KMP与字典树的结合,就好像利用字典树存储多个字符串的next数组. 首先将所有关键单词建一棵字典树,每个节点除了存储26(字符种类数)个儿子外,还要储存sum和fail. sum用于记录此节点是否是某个关键词的尾字符,并且也可以顺便储存此字符串的个数 fail原创 2018-03-13 19:37:10 · 212 阅读 · 0 评论 -
高度数组
解释及作用 是后缀数组中相邻两个字符串的lcp(最长公共前缀),可以在O(n)的时间内高效求出,帮助做一些字符串匹配问题。 h[i]=lcp(st[i],st[i+1])(st表示后缀数组中表示的字符串)实现方法 如果已经知道后缀数组中i与i+1的lcp为h,那么i代表的字符串与i+1代表的字符串去掉首字母后的lcp为h-1.根据这个我们可以发现,如果知道i与后缀数组中在它后一个的l原创 2018-03-11 11:42:52 · 570 阅读 · 0 评论 -
BZOJ4502 串
Description兔子们在玩字符串的游戏。首先,它们拿出了一个字符串集合S,然后它们定义一个字 符串为“好”的,当且仅当它可以被分成非空的两段,其中每一段都是字符串集合S中某个字符串的前缀。 比如对于字符串集合{“abc”,”bca”},字符串”abb”,”abab”是“好”的(”abb”=”ab”+”b”,abab=”ab”+”ab”),而字符串“bc”不是“好”的。 兔子们想知道,一共原创 2018-03-15 18:43:23 · 545 阅读 · 0 评论 -
后缀数组
解释及作用 对于一个字符串,将其所有后缀排序,用后缀中的第一个字符代表这个后缀,那么排序后的数组就是后缀数组,例如,对于字符串ababs,它的后缀数组是1 3 2 4 5,因为 1.ababs -开始位置为1,排名第1 2.babs –开始位置为2,排名第3 3.abs—-开始位置为3,排名第2 4.bs——开始位置为4,排名第4 5.s——–开始位置为5,排名第5原创 2018-03-08 23:32:09 · 265 阅读 · 6 评论 -
Tsinsen A1393. Palisection
题面题意给出一个字符串,求其中相交的回文串的对数.做法可以反过来考虑,求出不相交的所有回文串对数,最后再用总数减去. 首先可以建一个回文自动机,求出再i点左边有几个回文串,然后再将字符串倒过来建一个回文自动机,求出以每个点为左端点的回文串的个数,将上下两个量分别相乘即可求出不相交的回文串的个数.代码#include<iostream>#include<cstdio>#include<cstri原创 2018-03-30 15:53:07 · 280 阅读 · 0 评论 -
SPOJ - LCS2 - Longest Common Substring II
题面题意给出最多十个字符串,求它们的最长公共子串.做法大致思路是对第一个字符串建出后缀自动机后,每个字符串都去匹配,对于自动机上每一个节点都用一个临时数组求出它所能匹配到的最长后缀长度,每个字符串匹配完后临时数组与上一次匹配后的结束状态取一个最小值. 一开始TLE了一次,WA了一次. TLE那次我更新临时数组上的某个点时,沿着它的fail向上更新了所有点,这样对于极限数据将会退化成O(n^2),原创 2018-03-31 19:06:25 · 250 阅读 · 0 评论 -
poj 2778 DNA Sequence
题面题意给出至多10个由A,G,T,C组成的字符串,问长度为n(n<=2e9),由A,G,T,C组成的且不包含之前给的几个字符串的字符串有几个.做法因为是多个字符串的匹配问题,首先建出AC自动机,若n比较小则可以在自动机上dp,但因为n很大,而且给出的字符串又短又少,故可以用矩阵快速幂. 首先找出自动机上的所有合法节点(不包含给出字符串的节点),然后统计出它们后面加一个字符能够到达的节点及个数,保原创 2018-04-01 17:54:46 · 279 阅读 · 0 评论 -
bzoj 2565: 最长双回文串
题面题意给出一个回文串,求相邻两个回文串的最长长度之和.做法像这样涉及两个回文串的关系的题目,都可以考虑正着和反着分别加入回文自动机,预处理出以每个点为左右端点的最长回文串的长度,最后再枚举断点统计答案即可.代码#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#define N 500100usin原创 2018-04-05 15:52:31 · 684 阅读 · 1 评论 -
manacher(马拉车)
作用可以在O(n)的时间计算出以每个字符或者两个字符为中心的最长回文串的长度,也可以凭借此求出最长回文串等. 相比于回文自动机,manacher侧重于求以每个或两个字符为中心的最长回文串,而回文自动机则侧重于求以每个字符为左右端点的最长回文串,而且manacher更加好写.实现方法首先我们在字符串两两字符之间加入永远不可能出现的字符,比如:!@#$%^&*,这样原串中的所有回文串都有一个中心.原创 2018-04-05 16:46:32 · 216 阅读 · 0 评论 -
bzoj 2342: [Shoi2011]双倍回文
题面题意令W(R)表示字符串W的反串 给出一个字符串,问其中最长的WW(R)WW(R)的长度是多少.做法求的字符串是个回文串,而且可以分成两个一样的偶数长度的字符串,那么可以考虑枚举两个相同字符串中间的空隙x并考虑右边那个字符串中间的空隙y的最大值. 首先用马拉车算法预处理出mx数组表示以某个空隙为中间的回文串的长度的一半,根据回文串的性质,不难得出以i为中心,长度的一半小于mx[i]的字符串也原创 2018-04-06 07:56:46 · 224 阅读 · 0 评论 -
bzoj 2434: [Noi2011]阿狸的打字机
题面题意给出一个字符串,表示一系列操作,对于被操作串(初始为空串)一共有一下三种操作: 1.给出a~z中的一个字符,表示在后面加上这个字符 2.B,删去一个字符 3.P,记录下此时的操作串 最后多次询问i串在j串中出现了几次做法根据数据范围,如果暴力模拟,记录下每次操作后的字符串,空间立刻就炸了,所以肯定要用字典树来存. 还可以发现如果对每次询问都暴力匹配或是在AC自动机上直接匹配,绝对会原创 2018-04-06 12:01:19 · 208 阅读 · 0 评论 -
Palindromic Tree 回文自动机-回文树
作用回文自动机,顾名思义,用于解决回文串的问题,可以用于处理回文串的数量,种类数等问题.构造方法与其他自动机差不多,一般记录son[字符个数] (在左右两边加入某字符后匹配的节点),len(长度),fail(失配后所到达的节点,也就是这个回文串的最长回文后缀). 一开始有两个节点,长度分别为0(偶数长度的回文字符串的起始点)和-1(奇数长度的回文字符串的起始点,定为-1可方便后面的计算) 新加入原创 2018-03-29 19:42:04 · 321 阅读 · 0 评论 -
后缀自动机
作用常用于处理字符串问题,可以高效解决许多字符串问题。实现方法有点像将一个字符串的所有后缀都建在一个AC自动机上,但不同的是后缀自动机的节点数最多为2*n,因为它只记录需要记录的点,一些没有记录东西的点可以视为与下面有价值的节点并在一起,这样大大降低了时间复杂度和空间复杂度。 对于每一个节点记录它的后面加上每个字符后后缀最长可以到达的节点,以及它的长度len,它去掉一个最短前缀后存在的节点pre。原创 2018-03-14 23:47:47 · 352 阅读 · 0 评论 -
codeforces954I Yet Another String Matching Problem
题面题意定义一种对字符串的操作为将某种字符全部替换为另一种字符,定义两个字符串之间的距离为让两个串相同的最少操作次数.现给出两个字符串S,T,求S的每个长度为∣|∣T∣|∣的子串与T之间的距离.做法首先转化一下两个字符串a,b之间的距离,若a[i]=u,b[i]=va[i]=u,b[i]=va[i]=u,b[i]=v,则可以由u向v连一条边,这样最后所有联通块的大小减一之和即为答案.现...原创 2019-04-18 08:42:32 · 342 阅读 · 0 评论