题目描述:

长度为n<=25的密码,至少包含m<=10个神奇单词中的k个(单词长度<=10),求所有可能的密码个数。

题目分析:

设f[i][s][j]f[i][s][j]f[i][s][j]表示用了iii个字母,已经包含的神奇单词的状态为sss,当前在AC自动机上的jjj号点的方案数。
转移为f[i+1][s∣word[ch[j][c]]][ch[j][c]]+=f[i][s][j]f[i+1][s|word[ch[j][c]]][ch[j][c]]+=f[i][s][j]f[i+1][s∣word[ch[j][c]]][ch[j][c]]+=f[i][s][j]。复杂度O(nmlen2m∗26)O(nmlen2^m*26)O(nmlen2m∗26),很多状态是0可以跳过。

Code:

#include<cstdio>
#include<cstring>
#define maxn 105
#define maxc 26
const int mod = 20090717;
int n,m,k;
char s[maxn];
struct ac_automaton{int ch[maxn][maxc],fail[maxn],cnt[maxn],tot,f[1025][maxn],g[1025][maxn];inline void init(){memset(ch,0,sizeof ch);memset(cnt,0,sizeof cnt);memset(f,0,sizeof f);tot=0;}inline void insert(char *s,int id){int len=strlen(s),r=0,v;for(int i=0;i<len;r=ch[r][v],i++) if(!ch[r][v=s[i]-'a']) ch[r][v]=++tot;cnt[r]|=(1<<id);}int Q[maxn],head,tail;inline void build(){Q[head=0]=0,tail=1;while(head<tail){int r=Q[head++],c;for(int i=0;i<maxc;i++)if(c=ch[r][i]) fail[c]=r?ch[fail[r]][i]:0,Q[tail++]=c,cnt[c]|=cnt[fail[c]];else ch[r][i]=ch[fail[r]][i];}}inline void add(int &a,const int b){a=(a+b)%mod;}inline void solve(){int ans=0;f[0][0]=1;for(int l=1;l<=n;l++){memset(g,0,sizeof g);for(int s=0;s<(1<<m);s++)for(int i=0;i<=tot;i++) if(f[s][i])for(int j=0;j<maxc;j++)add(g[s|cnt[ch[i][j]]][ch[i][j]],f[s][i]);memcpy(f,g,sizeof f);}for(int s=0;s<(1<<m);s++){int x=0;for(int i=0;i<m;i++) if(s&(1<<i)) x++;if(x>=k) for(int i=0;i<=tot;i++) add(ans,f[s][i]);}printf("%d\n",ans);}
}A;
int main()
{while(scanf("%d%d%d",&n,&m,&k),n){A.init();for(int i=0;i<m;i++) scanf("%s",s),A.insert(s,i);A.build();A.solve();}
}

HDU2825 Wireless Password【AC自动机 + DP】相关推荐

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

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

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

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

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

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

  4. uvalive4842(AC自动机+DP)

    题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...

  5. HDU 2296 Ring AC自动机 + DP

    题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...

  6. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  7. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

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

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

  9. UVALive 4126 Password Suspects(AC自动机+dp)

    题意就是长度为n的串,满足下列m个串是它的子串,问这个串有多少种,如果少于42种则字典序输出. dp[i][j][k]为,填充了i个字符,在ac自动机的j节点上,字串集合为k的方案数,填充i个字符可以 ...

  10. POJ 3691 DNA repair AC自动机 + DP

    题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道  dp[i][j] 为文本串到 第i ...

最新文章

  1. NIO中那些奇怪的Buffer
  2. php写js跳转页面,php实现页面的三种跳转
  3. mt4 不显示服务器速度,mt4显示服务器时间设置
  4. [北京活动] 5月11日 PMCAFF创业私密分享会邀请函已经下发
  5. Mysql存储引擎原理
  6. 戴尔发布面向制造、生命科学和研究的高性能计算系统
  7. RepVGG算法详解
  8. 您的MyFitnessPal帐户几乎肯定已被黑客入侵,请立即更改密码
  9. 160 - 16 bjanes.2
  10. 用VBScript实现Zip压缩目录中的所有文件
  11. PHP单次数据库查询实现无限级分类
  12. cocos2d-x CCArray用法 遍历和删除元素
  13. 输入法分类总结与优缺点
  14. 联想教育应用使用说明(7.6版本)——第4章 网络控制工具的使用
  15. SD-WAN、MPLS 、IPsec 和物理专线的区别
  16. 机器学习算法——聚类3(k均值算法)
  17. AXURE RP8实战手册 网站和APP原型制作案例精粹
  18. Android 一键加速
  19. 全球与中国汽车牛皮革市场“十四五”前景规划及运营趋势研究报告2022-2028年
  20. 网页简单整合Skype

热门文章

  1. 服务器在线测速系统源码_亲测可用
  2. No virtual method setOutputFile Ljava/io/File V in class Landroid/media/MediaRecorder
  3. BZOJ 4568 幸运数字
  4. dhcp服务器怎样自动,dhcp服务器设置教程【图文教程】
  5. 【深度学习笔记】理解Bicubic,双三次插值
  6. linux 用户权限不够,linux .权限不够怎么办
  7. 【现代货币银行学】货币与货币制度
  8. spyder指定python环境
  9. perl uc,lc,ucfirst,lcfirst的用法
  10. 信息学奥赛一本通:1097:画矩形