随笔分类 -  字符串处理之ac自动机

摘要:题意:有一个串s,n个串模式串t,问s的子串中长度最小的包含t k次的长度是多少 题解:把所有t建ac自动机,把s在ac自动机上匹配.保存每个模式串在s中出现的位置.这里由于t两两不同最多只有xsqrt(x),x是总长度.然后双指针扫一遍即可 这里有一个很重要的优化技巧,由于ac自动机上不是每个点都 阅读全文
posted @ 2019-04-16 19:41 walfy 阅读(134) 评论(0) 推荐(0)
摘要:题意:给一个n k的循环字符串可能从任意地方断开,然后m个长度k的字符串,问你能不能用下面的字符串(每个最多用一次)构成上面的字符串,能循环移位 题解:对下面的串建ac自动机,记录字符串最后一个位置,然后把上面的串扩展k个,再在ac自动机上跑确定每个节点能匹配的字符串是谁,然后枚举k个位置作为起点, 阅读全文
posted @ 2019-04-16 12:43 walfy 阅读(220) 评论(0) 推荐(0)
摘要:"bzoj2434" 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有28个按键,分别印有26个小写英文字母和'B'、'P'两个字母。 经阿狸研究发现,这个打字机是这样工作的: l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。 l 按一下印有'B 阅读全文
posted @ 2018-07-11 10:40 walfy 阅读(179) 评论(0) 推荐(0)
摘要:某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。 Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,Nfail=q,那么root到q一定是root到p的子串,所以q加上root p出现 阅读全文
posted @ 2018-07-05 15:17 walfy 阅读(213) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=5955 题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少 题解:先建成ac自动机构造fail数组,然后因为fail指针可能向前转移所以不能不能直接递推dp,需要高斯消元解方程 阅读全文
posted @ 2018-05-04 00:13 walfy 阅读(285) 评论(0) 推荐(0)
摘要:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6000),所以dp转移,dp[i][j]表示前i个跑到j状态的不包含子串的情况数 //#pragma 阅读全文
posted @ 2018-04-27 20:48 walfy 阅读(199) 评论(0) 推荐(0)
摘要:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X 阅读全文
posted @ 2018-04-15 14:23 walfy 阅读(172) 评论(0) 推荐(0)
摘要:这题主要就是解码过程很恶心,不能用char存,一共wa了20发 题意:先给n串加密后的字符,然后m串加密后的字符,解码之后求n对应每个m的匹配数,很显然的ac自动机 加密过程是先用对应ascii表的标号来代替字符,然后把这些数字转换成8位的二进制,全部连起来,然后每6位算一个数,用二进制算成整数,最 阅读全文
posted @ 2017-09-29 09:02 walfy 阅读(271) 评论(0) 推荐(0)
摘要:和上一题有点相似,但是这题是求包含的,并且还要求和 可以求所有情况-不包含的情况,所有情况可用矩阵快速幂求得 还有一点就是如果题目说答案余2^64,直接开unsigned long long就行了,会自动取膜的 #include<bits/stdc++.h> #define fi first #de 阅读全文
posted @ 2017-09-22 15:22 walfy 阅读(286) 评论(0) 推荐(0)
摘要:给m个子串,求长度为n的不包含子串的母串数,最直接的应该是暴搜,肯定tle,考虑用ac自动机 将子串建成字典树,通过next表来构造矩阵,然后用矩阵快速幂求长度为n的数量 邻接矩阵https://wenku.baidu.com/view/d7b9787f1711cc7931b716b0.html 对 阅读全文
posted @ 2017-09-21 16:35 walfy 阅读(255) 评论(0) 推荐(0)
摘要:傻逼多组测试,想了很久不知道为什么wa,结果是多组测试 ac自动机很多时候就是对End数组的操作,这题是用End数组记录末尾的字符串,query的时候sum综合一下End数组 #include<bits/stdc++.h> #define fi first #define se second #de 阅读全文
posted @ 2017-09-19 18:32 walfy 阅读(170) 评论(0) 推荐(0)
摘要:这题还是ac自动机裸题,只不过就是格式很烦人 有几个坑点:输入可能有空格,ascll可见字符从32开始到126有95个 wa点,用string输入,不能含空格,用scanf输入字符数组时没有memset,每次计算set里面的末尾值之后就清空了 #include<bits/stdc++.h> #def 阅读全文
posted @ 2017-09-19 16:28 walfy 阅读(153) 评论(0) 推荐(0)
摘要:貌似字典树也能过,原理不多赘述了,主要就是字典树+kmp 设匹配串长度为n,模式串共m个,第i个记为si。 时间复杂度为O(n+∑mi=1length(si))。 ac自动机大致就是用字典树存下每个分串,再处理出fail数组,最后根据母串和fail数组进行逐一匹配 在对fail数组进行处理的时候,f 阅读全文
posted @ 2017-09-18 19:43 walfy 阅读(154) 评论(0) 推荐(0)