hdu2825

题意

给出一些字符串,要求构造一个长度为 \(n\) 的字符串至少包括其中的 \(k\) 个,问有多少种字符串满足条件。

分析

AC自动机 构造状态转移,然后 状态压缩DP 即可。
\(dp[i][j][k]\) 表示长度为 \(i\) 在 AC自动机上的状态为 \(j\) 已包含的字符串为 \(k\) 时的字符串数量( \(k\) 二进制表示是否有某个给出的字符串)。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int MAXN = 1e2 + 10;
const int MOD = 20090717;
struct Trie {int root, L, nxt[MAXN][26], fail[MAXN], val[MAXN];int newnode() {memset(nxt[L], -1, sizeof nxt[L]);return L++;}void init() {L = 0;root = newnode();memset(val, 0, sizeof val);memset(fail, 0, sizeof fail);}void insert(int id, char S[]) {int len = strlen(S);int now = root;for(int i = 0; i < len; i++) {int d = S[i] - 'a';if(nxt[now][d] == -1) nxt[now][d] = newnode();now = nxt[now][d];}val[now] |= (1 << id);}void build() {queue<int> Q;for(int i = 0; i < 26; i++) {if(nxt[root][i] == -1) nxt[root][i] = 0;else { fail[nxt[root][i]] = root; Q.push(nxt[root][i]); }}while(!Q.empty()) {int now = Q.front(); Q.pop();val[now] |= val[fail[now]];for(int i = 0; i < 26; i++) {if(nxt[now][i] == -1) nxt[now][i] = nxt[fail[now]][i];else { fail[nxt[now][i]] = nxt[fail[now]][i]; Q.push(nxt[now][i]); }}}}
}trie;
int dp[30][MAXN][1024];
int cnt[1024];
int main() {int n, m, k;cnt[0] = 0;for(int i = 1; i < 1024; i++) {int j = 0;while(!((i >> j) & 1)) j++;cnt[i] = cnt[i - (1 << j)] + 1;}while(~scanf("%d%d%d", &n, &m, &k) && (n + m + k)) {trie.init();for(int i = 0; i < m; i++) {char s[15];scanf("%s", s);trie.insert(i, s);}trie.build();for(int i = 0; i <= n; i++) {for(int j = 0; j < trie.L; j++) {for(int k = 0; k < (1 << m); k++) {dp[i][j][k] = 0;}}}dp[0][0][0] = 1;for(int i = 0; i < n; i++) {for(int j = 0; j < trie.L; j++) {for(int bit = 0; bit < (1 << m); bit++) {if(!dp[i][j][bit]) continue;for(int k = 0; k < 26; k++) {int tmp = trie.nxt[j][k];(dp[i + 1][tmp][trie.val[tmp] | bit] += dp[i][j][bit]) %= MOD;}}}}int sum = 0;for(int i = 0; i < trie.L; i++) {for(int j = 0; j < (1 << m); j++) {if(cnt[j] >= k) sum = (sum + dp[n][i][j]) % MOD;}}printf("%d\n", sum);}return 0;
}

转载于:https://www.cnblogs.com/ftae/p/7327999.html

hdu2825(AC 自动机)相关推荐

  1. 【hdu2825】ac自动机 + 状压dp

    传送门 题目大意: 给你一些密码片段字符串,让你求长度为n,且至少包含k个不同密码片段串的字符串的数量. 题解: 因为密码串不多,可以考虑状态压缩 设dp[i][j][sta]表示长为i的字符串匹配到 ...

  2. 【HDU2825】Wireless Password【AC自动机,状态压缩DP】

    题意 题目给出m(m<=10)个单词,每个单词的长度不超过10且仅由小写字母组成,给出一个正整数n(n<=25)和正整数k,问有多少方法可以组成长度为n的文本且最少包含k个给出的单词. 分 ...

  3. AC自动机+状压dp hdu2825 Wireless Password

    传送门:点击打开链接 题意:有个密码长度为n,现在有m个魔力单词,要求密码中魔力单词的种类数>=k,问这种密码的种类数. 思路:和之前一样,我们会想到AC自动机去压缩状态,把状态给简化.然后我们 ...

  4. AC自动机 从入门到模板

    前言 作为一名菜鸡选手,我的目的仅仅是初步了解ac自动机的原理和各种性质... 正篇 1.AC自动机的基本性质 AC自动机的前置技能点 KMP,字典树 ac自动机的原理解释可以参考 hihocode ...

  5. Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现

    多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...

  6. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  7. AC自动机算法及模板

    AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报  分类: AC自动机(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...

  8. Keywords Search AC自动机QAQ

    AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...

  9. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  10. 【Luogu3041】视频游戏的连击(AC自动机,动态规划)

    题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...

最新文章

  1. nodeJs-autoMerge
  2. AWS 开源 SageMaker,帮助开发人员优化机器学习模型
  3. 人工智能:第四章 计算智能(1)
  4. 中石油训练赛 - 斗地主(bfs)
  5. 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
  6. sklearn自学指南(part1)--Machine Learning in Python
  7. 编写Play 2的模块,第1部分:使工作正常
  8. python爬虫的技能_关于 Python 爬虫可能涉及到的技能点
  9. nginx php exec,PHP Web 端如何操作 Nginx 配置
  10. 227 用栈模拟汉诺塔问题
  11. 『天涯杂谈』衣食住行小窍门
  12. python设置散点图点的大小_matplotlib - pyplot散点图标记大小
  13. 解决vscode导致电脑很卡
  14. 初识Cura3D打印开源项目
  15. VMI - 供应商管理库存
  16. 电信ZNHG60光猫信息虚标
  17. 注册表 关闭打印机服务器,Win7系统添加打印机无Print Spooler服务无注册表解决方法...
  18. Java—String类的intern方法的学习
  19. MLC Flash 笔记
  20. 史上最全的nexus私服搭建全流程

热门文章

  1. java 两个图片相似度_JAVA比较两张图相似度
  2. STM32单片机基础知识总结(二)
  3. ps投影怎么做之教程:人像投影和物体长投影制作
  4. 1.1 波士顿房价预测
  5. arcpy投影(一)——prj、gtf文件定义、路径及解析(arcmap,arcpro)
  6. JAVA语言基础——基本语法
  7. RTOS 入门资料 整理
  8. ps怎么缩放图层大小_PS怎么快速修改图层大小|Adobe Photoshop CS6图层大小尺寸调整--系统之家...
  9. css在透明的背景下显示白色字体
  10. linux文件夹的执行权限不够怎么解决