
AC自动机
WerKeyTom_FTD
这个作者很懒,什么都没留下…
展开
-
[bzoj3530][SDOI2014]数数
题目描述求不大于N的所有正整数中有多少个满足以下条件的数:给定字符串集合S,把该数当作字符串(没有前导0),集合S中没有任意一个字符串是该字符串的子集。 N的长度不超过1200,集合中所有字符串长度和不超过1500。AC自动机上的DP将集合内所有字符串建出一颗AC自动机。 那么,我们需要预处理一个这样的next[i,j]表示在结点i上接下要走j的话会调整到的结点是什么。(即预处理所有可能出现的调原创 2015-12-30 19:53:24 · 819 阅读 · 0 评论 -
[bzoj3172][TJOI2013]单词
题目大意给定许多个单词,求每个单词在所有单词中出现的次数。SAM显然可以用SAM做。 一种是在单词与单词间加入字符{,第二种是trie上建sam,最简单当然是建广义后缀自动机。 建后缀树做法可以看用SAM建广义后缀树#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(i=a;i<=b;i++)原创 2016-03-11 14:04:55 · 633 阅读 · 0 评论 -
子串
题目大意SA+莫队我们把所有字符串连起来,中间有分割符分开,然后求SA。 那么,一个子串所在第几个单词可以看以其为前缀的后缀包含了几个分隔符。 对于每个询问,我们二分找出在SA上的对应区间。于是,询问可以改成这样:求[l,r]权值在[x,y]的权值种类数。 可以用莫队做,用分块维护就可以消掉log,这是经典套路。#include<cstdio> #include<algorithm> #in原创 2016-09-18 21:46:49 · 642 阅读 · 0 评论 -
[51nod 1587]半现串
题目大意有两个串S,T。T的长度是d。我们说T在S中半现的条件是当T的某一个长度为 ⌊d/2⌋ 的子串是S的一个子串。(子串是在原串中连续出现的一段字符串)。 现在给定一个原串s,另外给出x,y,他们都只包含数字字符,问区间[x,y]中在s中半现的数字有多少个。经典套路先转化为补集问题。 将S所有长度为d/2的串弄个AC自动机,然后做数位DP,f[i,j]表示做到第i位匹配到状态j。 匹配成功原创 2016-12-21 20:35:53 · 603 阅读 · 0 评论 -
[51nod 1587]半现串
题目描述http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1587AC自动机上的DP把S所有长度是d/2的提出来造个AC自动机。 然后做数位DP,用一维状态表示匹配到AC自动机上哪个节点。 匹配成功状态不要转移。 于是可以计算出不匹配的数量。#include<cstdio> #include<algorithm> #in原创 2017-01-12 20:26:10 · 467 阅读 · 2 评论 -
[bzoj4861]魔法咒语
题目描述瞎做显然是AC自动机dp。 小的直接dp大的矩阵乘法。#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; typedef long long ll; const int maxn=200+10,mo=1000000007原创 2017-04-20 16:53:04 · 936 阅读 · 0 评论