![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
字符串
kmp,AC自动机,后缀数组,SAM等
KXL5180
这个作者很懒,什么都没留下…
展开
-
B-Suffix Array (sort排序)牛客多校第一场A题
B-Suffix Array题意:给你一个字符串,同时定义一个BBB函数,对于一个字符串他的B函数为:B(s1s2s3...sn)=t1t2t3...tnB(s_1s_2s_3...s_n) = t_1t_2t_3...t_nB(s1s2s3...sn)=t1t2t3...tn其中ti=minj<i,s[j]=s[i],(i−j)t_i = min_{j<i,s[j]=s[i],}(i-j)ti=minj<i,s[j]=s[i],(i−j)如果前面没有出现s[i]s[原创 2020-07-13 21:34:31 · 568 阅读 · 0 评论 -
2020 年 “游族杯” 全国高校程序设计网络挑战赛
我同学叫我去打的。不说了,题还是不错的,但奈何我英语差。。。A. Amateur Chess Players不想解释。#include "bits/stdc++.h"using namespace std;#define ll long long#define SZ(x) ((int)(x.size()))#define all(x) (x).begin(),(x).end()const ll mod = 998244353;const int maxn = 100000 + 10;原创 2020-05-28 17:24:24 · 744 阅读 · 0 评论 -
Common Substrings POJ - 3415(后缀自动机)
https://vjudge.net/problem/POJ-3415其实很早以前这道题就过了,但不过因为后缀数组的方法自己也不是很懂就没有写。今天我学了一下后缀自动机,我们利用后缀自动机解决。首先对A串建立后缀自动机,然后对每一个非克隆结点进行标记, 然后建一颗fail树,用一个dfs进行计数,这个步骤就是其他博客上写的拓扑排序。首先对于一个结点,他所包含的子串个数为 len[i]−...原创 2020-01-11 20:35:28 · 334 阅读 · 0 评论 -
P5840 [COCI2015]Divljak【AC自动机+fail树+树上乱搞】
https://www.luogu.com.cn/problem/P5840题意:中文题,给你n个串,然后m次操作,两种操作。1操作,集合T加入一个串。2操作,询问集合T中出现上面的n个串的第i个几次。首先听说解法挺多的,如果有幸学会了,后来补上吧。做法:这里用AC自动机做吧,首先对n个串建立AC自动机,建立fail树,然后每一次往T集合中加入一个字符串,就让他到AC自动机中跑,跑到的点对...原创 2020-01-07 16:02:47 · 298 阅读 · 0 评论 -
E. Tree-String Problem (AC自动机+fail树)
https://codeforces.com/problemset/problem/291/E题意:给你一颗树,然后每一条边有一个字符串,然后给你一个字符串,问这个字符在所有的树的根到叶子结点练成的串中,出现了多少次。做法:建立AC自动机,每个点进行计数,在对询问串建AC自动机时不需要计数,然后dfs遍历fail树进行计数就可以了。#include "bits/stdc++.h"usin...原创 2020-01-07 09:35:40 · 349 阅读 · 0 评论 -
「TJOI2015」弦论
https://loj.ac/problem/2102只是一道后缀自动机的题目做法:首先当T=0时,就相当于从空串出发的有多少条路径,相当于每一个点都是1,然后dfs进行计数,在后缀自动机上进行贪心的输出就行了。当T=1是,就相当于对于每一个非clone的点都为1 ,然后在建fail树,进行计数就可以了,再用dfs进行计数,在贪心的输出就可以了。#include "bits/stdc++....原创 2020-01-03 13:44:23 · 293 阅读 · 0 评论 -
「SDOI2016」生成魔咒
https://loj.ac/problem/2033题意:这道题是中文题。就是给你一个字符串,询问每一个前缀中有多少个不同子串。做法:说到不同子串的数量,应该想到的是某种字符串算法。这道题应该用后缀自动机解决。首先一个字符串中不同子串的数量就是从空串起点t0t_0t0出发有多少条路径。我们可以利用SAM的树形结构跑一个动态规划 dp[u]=1+∑vdp[v]dp[u]=1+\sum_...原创 2019-12-31 18:54:51 · 279 阅读 · 0 评论 -
P3804 【模板】后缀自动机 (SAM)
https://www.luogu.com.cn/problem/P3804很早以前就想把这个坑补了,最近终于把他补了。后缀自动机是对一个字符串信息高度压缩后的产物。这次把这个坑了补了。建议从这些博客入门https://www.cnblogs.com/xzyxzy/p/9186759.htmlhttps://oi-wiki.org/string/sam/https://www.luo...原创 2019-12-31 17:12:26 · 430 阅读 · 0 评论 -
湖南大学ACM程序设计新生杯大赛F string(AC 自动机)
https://ac.nowcoder.com/acm/problem/14612题意:也很简单,就是加入一些字符串,然后查询在特定的串的出了多少次,并不是多少个;做法:这道题肯定不能用普通的KMP,其他KMP我就不知道了,首先想到的就是AC自动机,但不过我们学的AC自动机都没有中间加入字符串的功能,我首先想到的就是,暴力建Trie果不其然直接T了,然后看了一下大佬的代码,他是按照二进制的...原创 2019-04-23 16:55:11 · 1124 阅读 · 2 评论 -
2018 ICPC 南京 M题 Mediocre String Problem ——Gym - 101981M
https://blog.csdn.net/KXL5180/article/details/90142634http://fastvj.rainng.com/problem/Gym-101981Mhttp://codeforces.com/gym/101981/attachments继上一篇文章关于南京M题的做法,这次我有学习了字符串hash有写了一个字符串hash的做法做法:第一...原创 2019-05-21 16:14:16 · 335 阅读 · 0 评论 -
GAUSS 2014-AC自动机
https://www.oj.swust.edu.cn/problem/show/2790题意中文不说了做法:就是标准的AC自动机+矩阵快速幂POJ - 2778的弱化版直接建AC自动机,如果i到j有一条边,直接g[i][j]++;最后sum(g^n[0][1-k]就可以了#include<bits/stdc++.h>using namespace std...原创 2019-05-18 15:17:47 · 238 阅读 · 4 评论 -
上决╇ф的遗言-后缀数组
https://www.oj.swust.edu.cn/problem/show/2779题意中文题不说了。做法:后缀数组,想把两个串连接起来,求sa和height数组,因为题目要求求的公共子串,而且每一个串只出现一次,所以标记每一个后缀属于哪一个串,遍历heigh数组,然后判断周围有没有height值大于等于当前下标的,如果没有则这个串的是可以取得,但不过,直接去这个串是不行的,所以...原创 2019-05-18 15:06:15 · 203 阅读 · 0 评论 -
洛谷 P3649 回文树 回文自动机板子
https://www.luogu.org/problemnew/show/P3649这道题就是一个板子题;回文自动机这个东西,前几天刚刚听说,看了两天感觉不是怎么好用呢。网上的博客写得也很不错,今天在这里写一个板子。回文自动机主要就是有两个根,奇数回文串,偶数回文串两个根,fail的和AC自动机差不多,主要注意这些吧。#include<bits/stdc++.h>...原创 2019-05-13 12:35:39 · 588 阅读 · 4 评论 -
2018 ICPC 南京 M题 Mediocre String Problem ——Gym - 101981M
http://fastvj.rainng.com/problem/Gym-101981Mhttp://codeforces.com/gym/101981/attachments题意:给你两个串s和t串,从s串中选出一个子串,然后再t串中取一个前缀出来,组合出是回文串一共有多少中方法。做法:这道题,我训练的时候想到了用找出t串在s串中匹配的位置,然后找出s串中每一个起点开始的回文串的数量...原创 2019-05-12 17:29:40 · 415 阅读 · 0 评论 -
P3805 【模板】manacher算法
https://www.luogu.org/problemnew/show/P3805就是一个马拉车算法的模板,这个算法总的来说不是很难,网上的博客都讲的挺好的,特此在这里写一个模板。#include<bits/stdc++.h>using namespace std;const int N=11000000+10;char s[N],snew[N*2];int p[...原创 2019-05-10 15:41:52 · 260 阅读 · 0 评论 -
2018 ICPC 焦作 Can You Solve the Harder Problem? Gym - 102028H
http://codeforces.com/gym/102028/problem/H题意:叫我们求不同的串的价值,一个串的价值定义为这个串中的最大值。做法:首先看到不同的串,即顺序数值都不同,关于这个我们直接用后缀数组解决。但不过关于价值怎么求,就是一个问题了。首先考虑都不同的时候,我们考虑一个每一个位置可以贡献的最大价值,当前位置为i,从左到右,第一个大于等于i的位置pos;则当...原创 2019-05-07 19:34:28 · 474 阅读 · 0 评论 -
UVA-12338 Anti-Rhyme Pairs 后缀数组+区间最值
http://fastvj.rainng.com/problem/UVA-12338题意:给你n个串,然后q次询问,每次询问第l个和第r个相同的子串的长度。做法:直接全部连起来求一个后缀数组,然后标记每一个串的位置,然后询问的就是rank[pos[l]]到rank[pos[r]]的height数组的最小值。可以用ST表做,建议用ST表,也可以线段树。注意数组开大一点两百万差不多了。#...原创 2019-05-05 17:25:50 · 187 阅读 · 0 评论 -
POJ3261 Milk Patterns 后缀数组
http://poj.org/problem?id=3261题意就是给你一个数字串,让你求一个串中重复至少出现k次的最长重叠子串。做法:用后缀数组也很简单,直接对他求后缀数组,然后二分答案,就可以了,验证的时候就是验证是否有连续的k-1个height数组的值都大于等于mid,和我以前写的几道题都差不多,但不过注意这道题数据中有0,所以加加一下。#include<iostream...原创 2019-05-05 17:19:54 · 95 阅读 · 0 评论 -
URAL1297 Palindrome 后缀数组
http://fastvj.rainng.com/problem/URAL-1297题意为求最长回文串。这个题也好做,我们就把输入的字符串str和他自己反向链接,然后求sa数组和height数组;最后遍历后缀数组,这个时候就要细心了,首先你要判断sa[i-1],sa[i]是不是分别属于两个字符串了,并且还有判断是不是回文串的起点,记录位置的变量初始化为0,就可以了#include...原创 2019-05-04 21:22:08 · 237 阅读 · 0 评论 -
POJ3294 Life Forms(后缀数组模板题)
http://poj.org/problem?id=3294题意题意为给你n个字符串,求至少出现在向上取整n/2的个串的公共子串如果有多个就输出多个。这道题和POJ3450一样的,可以看看我写的POJ3450;对于答案的储存用vector就可以了#include<iostream>#include<algorithm>#include<stdio...原创 2019-05-04 21:15:21 · 202 阅读 · 0 评论 -
POJ3450 Corporate Identity (后缀数组模板题)
http://poj.org/problem?id=3450题意为求多个串的最长公共子串;这道题我们可以仿造POJ2774的做法,吧每一个串连接起来,然后对他求一个sa数组和height数组,暴力的做法就是遍历所有的长度,但不过这道题显然不能,就是后缀数组写这道题效率都很低。我们可以二分答案,优化一下,这道题就可以过去了。在二分过程中遍历height数组,如果有某一段连续的区间数组...原创 2019-05-04 21:08:18 · 237 阅读 · 0 评论 -
POJ 2774 Long Long Message 后缀数组模板题
http://poj.org/problem?id=2774题意:给你两个字符串,问其中重叠的子串的最大长度;做法:直接连起来,跑一个后缀数组,求height数组就完了,但不过注意zzzbcd cdbcdcd的情况所以中间加一个其他字符隔开。#include<iostream>#include<algorithm>#include<stdio.h&g...原创 2019-05-03 18:23:06 · 131 阅读 · 0 评论 -
后缀数组 倍增算法代码详解
关于后缀数组,在刘汝佳的蓝书上已经有过介绍。关于算法的流程是比较详细的。但不过关于求sa数组的代码看起来就有一定的难度。我看了很多博客,又在B站看了几遍视频,终于有一个大致的框图了,至于后缀数组是拿来干什么的就不要问我了。首先关于算法流程这张经典的图相信大家看过很多遍了吧现在来看看代码首先讲几个数组;sa数组:在完成后缀数组前,表示关键字的排名的位置,下标表示名次,数组...原创 2019-05-02 17:35:42 · 519 阅读 · 2 评论 -
Codeforces 163E (AC自动机&fail树+dfs序+树状数组)
http://codeforces.com/contest/163/problem/E实在不好意思,自己画的时候确实有点粗心,感谢大家的提醒。。这次图应该画对了。。题意:给你几个串,然后后面有些操作,分别是给你一个文本串问哪些模式串在文本串出现了多少次,剩下两个分别就是删除一些字符串,和恢复一些字符串。做法:AC自动机,(据说还有后缀数组。。不会),如果做过阿狸的打字机这道题应该知道怎...原创 2019-04-28 21:18:26 · 401 阅读 · 0 评论 -
[JSOI2007]文本生成器 AC自动机
https://www.luogu.org/problemnew/show/P4052https://ac.nowcoder.com/acm/problem/20155中文题,相信大家都读得懂;首先要求出现过的串的总数,就用总数,减去,没有出现过的,既然是几个串,那就是AC自动机,加矩阵快速幂,但不过这道题由于文本比较长所以就只有用dp刚刚开始想着用类似的数位dp的办法做,只能过一半的...原创 2019-04-28 17:32:09 · 142 阅读 · 0 评论 -
P3311 [SDOI2014]数数 AC自动机+数位dp
https://www.luogu.org/problemnew/show/P3311题意都是中文的,相信大家都很清楚这道题我最开始以为是矩阵快速幂。。。但不过发现第一位不能是零,题目是小于N的,这样好像并不好弄。既然与数的位数有关就用数位dp吧,其实数位dp我也忘了怎么写。首先建立AC自动机,然后dp[pos][j]表示第pos位和自动机上j位的匹配数,然后直接枚举相加就可以了,...原创 2019-04-27 10:34:26 · 193 阅读 · 0 评论 -
[TJOI2013]单词 AC自动机fail树的简单应用
https://ac.nowcoder.com/acm/problem/20443https://www.luogu.org/problemnew/show/P3966题意:给出n个单词,一篇文章由这n个单词组成,问每个单词在文中的串出现的次数,其中包括自己本身。首先:每一个字符串建Trie然后,建立fail的指针,一个串要在其他串出现过,必定是另一个串的前缀的后缀形式出现的,我们在建...原创 2019-04-26 13:26:11 · 612 阅读 · 0 评论 -
阿狸的打字机 Trie fail树+树状数组+dfs序
https://ac.nowcoder.com/acm/problem/17633题意就不说了,那上面说得很清楚了;这道题最暴力的办法就是,每个字符串都跑next数组,然后kmp匹配,数据很小的时候,可以这样,但不过这道题就不能了,太暴力了。所以我们还是想想Trie(AC自动机吧),这道题用到了一个很有用的结论,我觉得这个结论在字符串配中还是很重要的T串为S串的子串,当且仅当T是S...原创 2019-04-25 21:21:37 · 709 阅读 · 1 评论 -
HDU 2296 Ring AC自动机加上字符串dp
http://acm.hdu.edu.cn/showproblem.php?pid=2296题意:构造一个长度为n的字符串,价值最大。看见网上的大佬都说很简单,但不过我还是错了24次,最后看了博客还是不知道,然后一部分的按着博客的改,最后还是错了,隔了很久发现AC自动机写错了,最后改了也不对,第二天重新写了几发就对了。做法,利用AC自动机可以记录字符串匹配的状态的一个路径的思想,构建一...原创 2019-03-11 20:23:44 · 184 阅读 · 0 评论 -
HDU2222 AC自动机静态模板
本蒟蒻第一次做AC自动机好慌哦;http://acm.hdu.edu.cn/showproblem.php?pid=2222题目的意思不多说了,就是求目标串中有几个模式串。虽然很简单,但不过我还是做了很久。关于AC自动机,有静态和动态模板两种,静态好像效率比较高,速度也较快(但为什么这道题动态快一点呢),动态好像内存需求有点大,但不过都是基于字典树,还是比较好写的。我觉得静态的比较好写...原创 2019-03-03 20:39:15 · 158 阅读 · 0 评论