传送门
写在前面:依旧有毒的HDU,读题半天看不懂啊,感觉自动机的精通遥遥无期啊!
思路:
题意——给定m个给定的串(可能相同),要求组建一个给定长度为n的新串,要求新串中至少包含k个给定的串(序号重复算一个),求组成新串的方案数,所有出现的字符都为’a’-‘z’
(看到数据范围这么小,先想到高维DP、状压DP和网络流)建trie树,建fail指针,然后在自动机上进行DP,f[i][j][p]代表DP到了长度为i的新串,此时在自动机上的节点为j,p是用01二进制来表示m个给定串的选取情况,选了就是1,没选就是0(所以建trie树给m个串的标号要注意是1<<(id-1),不是id)。f[i][j][p]能扩展的状态就是f[i+1][next][p|num[next]]f[i+1][next][p|num[next]]next是自动机上节点j能转移的所有编号(如果没有就回到fail节点找,建立fail的时候把这件事就办了),最后我们要的答案就是f[n][i][j],i是自动机上的任一节点,j在二进制下要求>=k个1,然而j的范围为0-1023,所以预处理出来0-1023所有数的二进制1的数量就可以了
注意:
初始化依旧要注意,同时仔细想想哪些需要清零,哪些能不用memset……
代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define mod 20090717
using namespace std;
int n,m,k,root=1,tot;
char s[15];
int trie[110][26],num[4000],f[30][110][1030],fail[4000],sum[1025];
queue<int>q;
void insert(char s[],int id)
{int now=root;for (int i=0;i<strlen(s);i++){if (!trie[now][s[i]-'a']) trie[now][s[i]-'a']=++tot;now=trie[now][s[i]-'a'];}num[now]|=(1<<id-1);
}
void build()
{int now,tmp;q.push(root);while (!q.empty()){now=q.front();q.pop();num[now]|=num[fail[now]];for(int i=0;i<26;i++)if (trie[now][i]){tmp=fail[now];while (tmp&&!trie[tmp][i]) tmp=fail[tmp];if (now!=root&&tmp) fail[trie[now][i]]=trie[tmp][i];else fail[trie[now][i]]=root;q.push(trie[now][i]);}else{if (now==root) trie[now][i]=root;else trie[now][i]=trie[fail[now]][i];}}
}
int main()
{for (int i=0;i<1024;i++){int t=i;while (t){if (t&1) sum[i]++;t>>=1;}}int x,y,z;scanf("%d%d%d",&n,&m,&k);while (n||m||k){int ans=0;tot=1;memset(trie,0,sizeof(trie));memset(num,0,sizeof(num));for (int i=1;i<=m;i++)scanf("%s",s),insert(s,i);for (int i=0;i<=tot;i++) fail[i]=0;build();for (int i=0;i<=n;i++)for (int j=0;j<=tot;j++)for (int p=0;p<(1<<m);p++) f[i][j][p]=0;f[0][1][0]=1;bool now=0;for (int i=0;i<n;i++)for (int j=1;j<=tot;j++)for (int p=0;p<(1<<m);p++)if (f[i][j][p])for (int l=0;l<26;l++)x=i+1,y=trie[j][l],z=num[y]|p,f[x][y][z]=(f[x][y][z]+f[i][j][p])%mod;for (int j=0;j<(1<<m);j++)if (sum[j]>=k)for (int i=1;i<=tot;i++)ans=(ans+f[n][i][j])%mod;printf("%d\n",ans);scanf("%d%d%d",&n,&m,&k);}
}

【HDU2825】Wireless Password,AC自动机+状态压缩DP相关推荐

  1. HDU 3341 Lost's revenge(AC自动机+状态压缩DP)

    Description 给出N个优良的基因段,每段长度小于等于10,只含有AGCT四种碱基. 现给一段基因片段S,|S|<=40.对其重排列后,最多能含有多少个优良基因,基因段可以有公共部分 I ...

  2. HDU - 2825 Wireless Password (AC自动机 + 状压dp)

    题目链接 题意 求至少包含KKK个给定字符串长度为NNN的字符串 思路 把所有可能的字符串建AC自动机,遍历所有节点dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示以节点jjj ...

  3. HDU - 2825 Wireless Password(AC自动机+状压dp)

    题目链接:点击查看 题目大意:给出 m 个匹配串,问长度为 n 的字符串中,至少包含 k 个匹配串(可重叠)的字符串有多少个 题目分析:考虑到n,m,k都特别小,所以可以先用AC自动机将状态关系转移出 ...

  4. hdu 2825 Wireless Password AC自动机+状态DP

    时间卡得紧,写成递推可以做一些优化 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cs ...

  5. 洛谷 P-4045 密码(AC自动机+状态压缩+数位DP+乱搞)

    洛谷 P-4045 密码 记AC的第一道黑题! 题意:已知一段密码包含了一些字符串,然后求满足条件的密码有多少个,数量小于42时还得全部输出 思路: 一开始WA了两个点,不知道WA的什么,索性把读入的 ...

  6. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...

  7. NEFU704(AC自动机+状态压缩)

    题目:Password Leakage #include <iostream> #include <string.h> #include <stdio.h> #in ...

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

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

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

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

最新文章

  1. 为什么要设置java环境变量_为什么要配置JDK环境变量?
  2. 编译问题二 /snmplib/tools.c:920 undefined reference to `clock_gettime' 问题解决
  3. 【线上分享】海外超低延时链路设计的挑战与优化实践
  4. mysql5.6优化建议
  5. 前端学习(2458):素材管理
  6. 如何做一个国产数据库(四)
  7. 基于matlab的prony方法实现,基于MATLAB的Prony方法实现
  8. WordPress根目录(Root)
  9. 蓝桥杯题目 abcde/fghij=n
  10. bootstrap 半透明背景_【小技巧】微信 QQ 半透明主题壁纸设置方法
  11. 【C 语言提高、进阶】Day 3
  12. EMNLP-21-Exploring Task Difficulty for Few-Shot Relation Extraction
  13. P02014171 刘天一 作业
  14. oracle locked time,Oracle里面的用户无法登录 LOCKED(TIMED)解决方法
  15. tcp的time wait为什么要等2个MSL
  16. 路由器网口1一直闪烁正常吗_路由器灯怎么闪才正常
  17. ARCore:ARCore的初体验
  18. burpsuite配置证书抓取htpps
  19. linux 浏览器问题
  20. 异步爬虫(高效爬虫)

热门文章

  1. 寒冬袭来,带你使用Flask开发一款天气查询软件吧
  2. 服务器虚拟化的培训,VMware服务器虚拟化及桌面虚拟化培训.pptx
  3. Spring AOP看这个就够了
  4. python调用另一个.py文件中的类和函数
  5. 台达杯自动化大赛设计方案
  6. pandas中计算两列相乘
  7. java中byte装箱和装箱_Java包装类、拆箱和装箱详解
  8. flash.net.filereference php,as3与php 上传单个图片demo
  9. 常用的数据结构_动态图展示 6 个常用的数据结构,一目了然
  10. 计算机网络实用技术教学资源,计算机网络实用技术第一章课件教学.ppt