摘要: [BZOJ][1] [Luogu][2] sol 至少出现一次?这怎么$DP$? 然而: 至少出现一次的方案数=总方案数 一次都没有出现的方案数 所以就把给出的字符串当作是不合法字符然后跑$DP$就可以了。 code cpp include include include include using 阅读全文
posted @ 2018-01-25 10:53 租酥雨 阅读(187) 评论(0) 推荐(0) 编辑
摘要: [BZOJ][1] [Luogu][2] sol 比较裸的$AC$自动机模板题。注意重复的单词的处理,这里使用的是并查集合并(注意也要维护大小)。较卡常。 code cpp include include include include using namespace std; const int 阅读全文
posted @ 2018-01-25 10:43 租酥雨 阅读(187) 评论(0) 推荐(0) 编辑
摘要: [Luogu][1] sol 如果存在一个合法的无限长的串,那势必说明在$AC$自动机上存在一个合法的环。由此转化为判环,只要判断搜到的点是否已经在搜索栈中即可。 code cpp include include include include using namespace std; const 阅读全文
posted @ 2018-01-25 10:40 租酥雨 阅读(164) 评论(0) 推荐(0) 编辑
摘要: [BZOJ][1] [Luogu][2] sol AC自动机做数位$DP$。首先位数小于$n$的位数的数只要满足没有不合法串即可,记$f_{i,j}$表示填了$i$个数,当前在$AC$自动机上编号为$j$的节点上的方案数,取答案$\sum_{i=1}^{n 1}\sum_{j=0}^{tot}f_{ 阅读全文
posted @ 2018-01-25 10:35 租酥雨 阅读(298) 评论(1) 推荐(0) 编辑
摘要: [题面][5] sol 开一个栈记录依次经过的$AC$自动机上的节点编号以及这一次的字母,若匹配到一个串就直接弹掉栈顶的$len$个元素,$len$为匹配到的模式串长度。弹栈顶直接$top =len$即可。 code cpp include include include include using 阅读全文
posted @ 2018-01-25 10:32 租酥雨 阅读(192) 评论(0) 推荐(0) 编辑
摘要: [BZOJ][1] [Luogu][2] sol 设$f_i$表示文章的前$i$个字符是否可以被理解。每次匹配要暴跳$fail$到根,转移就是$f_i|=f_{i len}$,其中$len$是某个可以匹配的模式串的串长。 code cpp include include include includ 阅读全文
posted @ 2018-01-25 10:30 租酥雨 阅读(142) 评论(0) 推荐(0) 编辑
摘要: [题面][1] sol 设$f_{i,j}$表示填了前$i$个字母,在$AC$自动机上跑到了节点$j$的最大得分。因为匹配需要暴跳$fail$所以预先把$fail$指针上面的匹配数传下来,这样就只要计算当前节点的贡献就可以了。 code cpp include include include inc 阅读全文
posted @ 2018-01-25 10:28 租酥雨 阅读(139) 评论(0) 推荐(0) 编辑