题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2825

题意:给一些字符串,构造出长度为n的字符串,它至少包含k个所给字符串,求能构造出的个数。

题解:

对end[]节点标记数组进行改动,用二进制下第几位表示即为包含第几个给定子串;

状态转移方程为:dp[i+1][x][k|end[x]]=(dp[i+1][x][k|end[x]]+dp[i][j][k])%mod;(没懂为什么要用‘ | ’ ,等搞明白了在更新吧,,)

dp[i][j][l] 表示长度 i 在第j个结点且当前包含字符串集合为 l 的方案数;

  1. 1 #include<bits/stdc++.h>
  2. 2 #define ll long long
  3. 3 using namespace std;
  4. 4
  5. 5 const ll mod=20090717;
  6. 6 const ll maxn = 111;
  7. 7 ll ans=0;
  8. 8 ll sum[1100];
  9. 9 ll n,m,k;
  10. 10
  11. 11 struct tire{
  12. 12 ll nxt[maxn][30],fail[maxn],end[maxn],tot,root,vis[maxn];
  13. 13 ll newNode(){
  14. 14 for(ll i=0;i<26;i++) nxt[tot][i] = -1;
  15. 15 end[tot++] = 0;
  16. 16 return tot-1;
  17. 17 }
  18. 18 void Init(){
  19. 19 tot = 0;
  20. 20 root = newNode();
  21. 21 memset(dp,0,sizeof(dp));
  22. 22 }
  23. 23 void Insert(char *buf,ll id){
  24. 24 ll len = strlen(buf),i,u = root;
  25. 25 for(i=0;i<len;i++){
  26. 26 ll x = buf[i]-'a';
  27. 27 if(nxt[u][x]==-1) nxt[u][x] = newNode();
  28. 28 u = nxt[u][x];
  29. 29 }
  30. 30 end[u] |= 1<<id;
  31. 31 }
  32. 32 void build(){
  33. 33 queue <ll> q;
  34. 34 fail[root] = root;
  35. 35 for(ll i=0;i<26;i++){
  36. 36 if(nxt[root][i]==-1) nxt[root][i] = root;
  37. 37 else{
  38. 38 fail[nxt[root][i]] = root;
  39. 39 q.push(nxt[root][i]);
  40. 40 }
  41. 41 }
  42. 42 while(!q.empty()){
  43. 43 ll now = q.front();
  44. 44 q.pop();
  45. 45 for(ll i=0;i<26;i++){
  46. 46 if(nxt[now][i]==-1) nxt[now][i] = nxt[fail[now]][i];
  47. 47 else{
  48. 48 fail[nxt[now][i]] = nxt[fail[now]][i];
  49. 49 q.push(nxt[now][i]);
  50. 50 }
  51. 51 }
  52. 52 end[now]|=end[fail[now]];
  53. 53 }
  54. 54 }
  55. 55 ll dp[30][111][1<<10];
  56. 56 void solve(){
  57. 57 dp[0][0][0]=1;
  58. 58 for(ll i=0;i<n;i++){
  59. 59 for(ll j=0;j<tot;j++){
  60. 60 for(ll k=0;k<(1<<m);k++){
  61. 61 if(dp[i][j][k]){
  62. 62 for(ll u=0;u<26;u++){
  63. 63 ll x=nxt[j][u];
  64. 64 dp[i+1][x][k|end[x]]+=dp[i][j][k];
  65. 65 dp[i+1][x][k|end[x]]%=mod;
  66. 66 }
  67. 67 }
  68. 68 }
  69. 69 }
  70. 70 }
  71. 71 ans=0;
  72. 72 for(ll i=0;i<tot;i++){
  73. 73 for(ll j=0;j<(1<<m);j++){
  74. 74 if(dp[n][i][j]&&sum[j]>=k) ans=(ans+dp[n][i][j])%mod;
  75. 75 }
  76. 76 }
  77. 77 cout<<ans<<endl;
  78. 78 }
  79. 79 }ac;
  80. 80
  81. 81 char s1[maxn];
  82. 82
  83. 83 int main()
  84. 84 {
  85. 85 for(ll i=0;i<(1<<10);i++){
  86. 86 for(ll j=0;j<10;j++){
  87. 87 if(i&(1<<j)) sum[i]++;
  88. 88 }
  89. 89 }
  90. 90 while(cin>>n>>m>>k){
  91. 91 if(!n&&!m&&!k) break;
  92. 92 ac.Init();
  93. 93 for(ll i=0;i<m;i++){
  94. 94 cin>>s1;
  95. 95 ac.Insert(s1,i);
  96. 96 }
  97. 97 ac.build();
  98. 98 ac.solve();
  99. 99 }
  100. 100 return 0;
  101. 101 }

HDU - 2825 Wireless Password (AC自动机+状压DP)的更多相关文章

  1. hdu2825 Wireless Password(AC自动机+状压dp)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  2. 【HDU2825】Wireless Password (AC自动机+状压DP)

    Wireless Password Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u De ...

  3. HDU2825 Wireless Password —— AC自动机 + 状压DP

    题目链接:https://vjudge.net/problem/HDU-2825 Wireless Password Time Limit: 2000/1000 MS (Java/Others)    ...

  4. HDU-2825 Wireless Password(AC自动机+状压DP)

    题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...

  5. hdu 4057--Rescue the Rabbit(AC自动机+状压DP)

    题目链接 Problem Description Dr. X is a biologist, who likes rabbits very much and can do everything for ...

  6. hdu_2825_Wireless Password(AC自动机+状压DP)

    题目链接:hdu_2825_Wireless Password 题意: 给你m个串,问长度为n至少含k个串的字符串有多少个 题解: 设dp[i][j][k]表示考虑到长度为i,第j个自动机的节点,含有 ...

  7. HDU 2825 Wireless Password(AC自动机+DP)

    题目链接 做题, #include <cstdio> #include <string> #include <cstring> using namespace st ...

  8. HDU - 2825 Wireless Password(AC自己主动机+DP)

    Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...

  9. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  10. HDU 2825 Wireless Password (AC自己主动机,DP)

    pid=2825">http://acm.hdu.edu.cn/showproblem.php? pid=2825 Wireless Password Time Limit: 2000 ...

随机推荐

  1. uber_go_guide解析(一)

    前言 实力有限,guide啃着好费劲 原地址https://github.com/xxjwxc/uber_go_guide_cn 加我自己的体会和补充 基于Golang 1.14 正文 Interfa ...

  2. python安装whl包时出现的问题解决:is not a supported wheel on this platform

    @ 目录 一.问题 二.查找问题 三.问题解决 一.问题 1.下载一个twisted包 安装Twisted,进入https://www.lfd.uci.edu/~gohlke/pythonlibs 下 ...

  3. 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  4. 【Linux】kali 安装 python3 和 pip3(亲测有效)

    [Linux]kali 安装 python3 和 pip3 引言:   在使用kali的时候,经常会用到各种工具以及脚本,而大多数脚本都是以python编写的,但是烦就烦在python有2个版本,有些 ...

  5. python模块/文件/日期时间

    文件操作:

  6. URL重定向 - Pikachu

    概述: 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方.如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能 ...

  7. 工作记录:记一次线上ZK掉线问题排查

    目录 问题的发现 zk的情况以及分析 总结 问题的发现 最早问题的发现在于用户提的,用户提出他支付时支付失败,过了一会儿再试就好了,于是翻日志,查询到当时duboo调用出现了下类错误: [TraceI ...

  8. su3和SU01中参数说明

    对于SU3和SU01中的的"参数"tab栏中的参数可以自己添加和删除. 所有的参数都存在表TPARA中,并且有对应的参数的说明. 那么这些参数如何使用呢? 通常的使用是,通过类似  ...

  9. 《进击吧!Blazor!》第一章 1.初识 Blazor

    作者介绍 陈超超 Ant Design Blazor 项目贡献者 拥有十多年从业经验,长期基于.Net技术栈进行架构与开发产品的工作,Ant Design Blazor 项目贡献者,现就职于正泰集团 ...

  10. 02. struts2中Action名称的搜索顺序

    搜索顺序 获得请求路径的URI,例如URL为:http://localhost:8080/struts2/path1/path2/path3/student.action 首先寻找namespace为 ...