字符串
文章平均质量分 65
字符串
YB Lin
这个作者很懒,什么都没留下…
展开
-
P2408 不同子串个数 SAM
传送门文章目录题意:思路:题意:求sss中本质不同的字串个数。1≤∣s∣≤1e51\le |s|\le 1e51≤∣s∣≤1e5思路:显然,个数就是∑(len[i]−len[fa[i]])\sum (len[i]-len[fa[i]])∑(len[i]−len[fa[i]])。//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")//#pragma GCC target("sse,sse2,sse3,原创 2021-09-28 09:32:49 · 114 阅读 · 0 评论 -
P3804 【模板】后缀自动机 (SAM)
传送门文章目录题意:思路:题意:给你一个字符串sss,让你求sss中出现次数不为111的子串出现次数乘上该字串长度最大值。∣s∣≤1e6|s|\le 1e6∣s∣≤1e6思路:没学明白,不多bbbbbb,把树建出来跑一下就行了。//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,a原创 2021-09-28 09:06:55 · 101 阅读 · 2 评论 -
1285. 单词 ac自动机 + fail树
传送门文章目录题意:思路:题意:一篇论文由若干单词构成,且单词间是隔开的,给你nnn个单词,要求你计算每个单词在论文中出现了多少次。1≤n≤2001\le n\le 2001≤n≤200,所有单词总长不超过1e61e61e6思路:考虑一种比较暴力的写法,我们将所有串仍acacac自动机里面,让后遍历每个单词,将其视为要匹配的串,每次都跑一遍,复杂度O(n1e6)O(n1e6)O(n1e6),还带常数,给了1s1s1s显然过不去。考虑每个单词在其他单词中出现的位置,都是一些前缀的后缀!所以我们可原创 2021-09-21 09:08:28 · 174 阅读 · 0 评论 -
P5357 【模板】AC自动机(二次加强版) fail树
传送门文章目录题意:思路:题意:思路:这个只能搞failfailfail树了,让后跑一遍即可。重复的字符串记一个,让后其他的都跟他一个答案即可。// Problem: P3796 【模板】AC自动机(加强版)// Contest: Luogu// URL: https://www.luogu.com.cn/problem/P3796// Memory Limit: 128 MB// Time Limit: 3000 ms// // Powered by CP Editor (ht原创 2021-09-20 11:35:22 · 113 阅读 · 0 评论 -
P3796 【模板】AC自动机(加强版)
传送门文章目录题意:思路:题意:给你nnn个模式串sss,以及一个文本串ttt,输出出现次数最多的模式串出现的次数和模式串本身。1≤n≤150,∣s∣≤70,∣t∣≤1e61\le n\le 150,|s|\le 70,|t|\le 1e61≤n≤150,∣s∣≤70,∣t∣≤1e6思路:将模式串仍acacac自动机里面,由于出现的模式串可重复,可以选择直接暴跳,复杂度是∣t∣∣s∣|t||s|∣t∣∣s∣,能通过本题。还可以建一颗failfailfail树,然后遍历文本串,给每个需要暴跳的起原创 2021-09-20 10:56:12 · 92 阅读 · 0 评论 -
AC Automaton
简单复习一下字符串,顺便存个板子。// Problem: P3808 【模板】AC自动机(简单版)// Contest: Luogu// URL: https://www.luogu.com.cn/problem/P3808// Memory Limit: 512 MB// Time Limit: 1000 ms// // Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-pr原创 2021-09-20 08:31:41 · 96 阅读 · 0 评论 -
HDU - 7084 Pty loves string kmp + fail树 + 主席树
传送门文章目录题意:思路:题意:给你一个字符串sss,有qqq个询问,每次给x,yx,yx,y代表取sss的前xxx个字符和后yyy个字符拼接起来得到ttt,输出ttt在sss中出现的次数。n,q≤2e5n,q\le2e5n,q≤2e5思路:考虑每个询问拼出来的串在sss中出现的位置,假设是[l,r][l,r][l,r],那么对于[1,x],[l,l+x−1][1,x],[l,l+x-1][1,x],[l,l+x−1]这两段区间一定是相等的,这也提示我们可以先预处理kmpkmpkmp数组nene原创 2021-08-19 21:02:54 · 211 阅读 · 0 评论 -
HDU - 6975 Forgiving Matching FFT匹配字符串
传送门文章目录题意:思路:题意:给你两个串a,ba,ba,b长度分别为n,mn,mn,m,你需要输出m+1m+1m+1个数,第iii个数表示当允许有i−1i-1i−1个数可以不匹配时aaa中长度为mmm的子串与bbb匹配的数量,匹配的意思就是可以有i−1i-1i−1个位置不同,其他位置相同。n≤2e5,a∈(0,1,...,9,∗)n\le2e5,a\in {(0,1,...,9,*)}n≤2e5,a∈(0,1,...,9,∗),其中∗*∗代表通配符,即与任何其他字符相同。思路:不多bb,直接上原创 2021-07-27 22:57:08 · 329 阅读 · 0 评论 -
hdu 6153 A Secret kmp + dp
传送门文章目录题意:思路:题意:给你两个串a,ba,ba,b,让你求对于bbb的每个后缀,设其长度为lenlenlen,其在aaa中出现的次数为cntcntcnt,那么他的贡献为len∗cntlen*cntlen∗cnt,求每个后缀的贡献和是多少。n≤1e6n\le1e6n≤1e6思路:首先我们将a,ba,ba,b都reversereversereverse一下,让后后缀就转换成了前缀。先考虑如何快速求出来bbb的某个前缀在aaa中出现的次数。首先需要知道我们可以通过dpdpdp快速算出来某个原创 2021-07-13 21:16:29 · 69 阅读 · 0 评论 -
Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes kmp + dp
传送门文章目录题意:思路:题意:思路:通过完美子串的定义,我们不难发现满足条件的子串就是kmpkmpkmp中ne[n]ne[n]ne[n]不断向前跳得到的串,现在问题就是如何求这些前缀串在串中出现的次数了。考虑一个前缀iii,那么一直暴跳ne[i]ne[i]ne[i],能跳到的前缀都需要加上前缀iii的出现次数。显然不能直接跳,所以考虑dpdpdp,dp[i]dp[i]dp[i]表示前缀iii的出现次数,那么转移方程就是dp[ne[i]]+=dp[i]dp[ne[i]]+=dp[i]dp[ne[原创 2021-07-08 15:36:49 · 157 阅读 · 0 评论 -
P3435 [POI2006]OKR-Periods of Words kmp + fail指针
传送门文章目录题意:思路:题意:思路:转换一下题意,就是求一个最小公共前后缀,显然可以暴跳nenene数组,复杂度O(n2)O(n^2)O(n2),注意到我们每次都跳的话会跳到很多重复的位置,假设当前跳到了xxx,我们每次跳完都将当前ne[i]=xne[i]=xne[i]=x,这样就会减少很多不必要的跳,复杂度O(n)O(n)O(n)。// Problem: P3435 [POI2006]OKR-Periods of Words// Contest: Luogu// URL: https:/原创 2021-07-03 23:47:41 · 108 阅读 · 0 评论 -
P4824 [USACO15FEB]Censoring S kmp + 栈
传送门文章目录题意:思路:题意:思路:如果删除之后两个串不拼起来就是个裸kmpkmpkmp了,但是这个题能拼起来,拼起来之后还有可能生成一个新的串,而且起点在当前位置之前。考虑是否能找到删掉之后从哪个位置开始,显然有点不可做。考虑到了第iii个位置,删掉了长度为mmm的串,那么应该到了第i−mi-mi−m的位置,我们不用考虑从哪里开始,可以发现只需要知道i−mi-mi−m的位置匹配到了TTT串的哪个位置,让后继续匹配就行了,所以我们开一个数组记录到了第iii个位置匹配到了哪个位置,让后再开一个原创 2021-07-03 23:35:58 · 111 阅读 · 0 评论 -
P2375 [NOI2014] 动物园 kmp fail指针/倍增
传送门文章目录题意:思路:题意:思路:由kmpkmpkmp中失配数组nenene的含义我们知道,ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...都是iii的相等的前后缀,但是可能有重叠的部分,那么就有一个显然的做法:对于每个iii,不断向前跳,记录ne[x]<=i/2ne[x]<=i/2ne[x]<=i/2的个数,复杂度O(n2)O(n^2)O(n2)。考虑优化,我们记录一个数组cnt[i]cnt[i]cnt[i原创 2021-07-03 23:29:21 · 140 阅读 · 2 评论 -
Educational Codeforces Round 81 (Rated for Div. 2) C. Obtain The String 序列自动机
传送门文章目录题意:思路:题意:给你两个串s,ts,ts,t,每次可以取sss串的一个子序列,问你最少取多少次子序列,将这些子序列拼起来能得到ttt。思路:发现我题解里面没写过序列自动机,来存个板子。我们可以贪心的从ttt的开头开始取,每次都找离当前位置最近的一个字符,这样可以保证次数最少。所以这就转换成了序列自动机的裸题了,从头开始跑序列自动机就行了,如果不存在当前字符就返回−1-1−1。//#pragma GCC optimize("Ofast,no-stack-protector,unr原创 2021-04-19 10:46:17 · 71 阅读 · 0 评论 -
Educational Codeforces Round 101 (Rated for Div. 2) F. Power Sockets 哈希 + 乱搞
传送门题意: 给一个二进制串aaa,让后定义两个串相似为有至少一个相同位置相等。现在让你找一个字典序最小的长度为kkk的串使其与aaa中每个长度为kkk的字串相似。思路: 首先我们知道所有可能的串一共有2k2^k2k,我们把aaa串全部取反,这样aaa的所有长度为kkk的串都是不符合条件的,除去这n−k+1n-k+1n−k+1个串,其他的串都是符合条件的,那么我们从000开始枚举到n−k+1n-k+1n−k+1转换成二进制一定可以找到一个符合条件的串。但是我们不一定有n−k+1n-k+1n−k+1个,上原创 2021-02-23 14:14:10 · 118 阅读 · 0 评论