给定m个模式串,求至少包含k个模式串长度为n的目标串的种数MOD20090717。end数组记录为模式串下标的二进制数,然后利用状态压缩dp来求解,dp[i][j][k],i为当前串长度,j为当前结点状态,s为包含串状态。最后答案为dp[n][i][j],i为枚举的所有结点,j为包含串转态大于等于k时的值,代码如下

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int MOD=20090717;int N,M,P;
struct Tree
{int next[300][26],end[300],fail[300];int L,root;int newnode(){for(int i=0;i<26;i++){next[L][i]=-1;}end[L++]=0;return L-1;}void init(){L=0;root=newnode();}void insert(char *s,int pow){int len=strlen(s);int p=root;for(int i=0;i<len;i++){int id=s[i]-'a';if(next[p][id]==-1){next[p][id]=newnode();}p=next[p][id];}end[p]|=(1<<pow);}void build(){queue<int>q;int p=root;fail[root]=root;for(int i=0;i<26;i++){if(next[p][i]==-1){next[p][i]=root;}else{fail[next[p][i]]=root;q.push(next[p][i]);}}while(!q.empty()){p=q.front();q.pop();end[p]|=end[fail[p]];for(int i=0;i<26;i++){if(next[p][i]==-1){next[p][i]=next[fail[p]][i];}else{fail[next[p][i]]=next[fail[p]][i];q.push(next[p][i]);}}}}void query(char *s){int len=strlen(s);int p=root,ans=0;for(int i=0;i<len;i++){int id=s[i]-'a';p=next[p][id];int temp=p;while(temp!=root){if(end[temp]){ans+=end[temp];end[temp]=0;}temp=fail[temp];}}}void debug(){for(int i = 0;i < L;i++){printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],end[i]);for(int j = 0;j < 26;j++)printf("%2d",next[i][j]);printf("]\n");}}
};Tree ac;
int num[3000];
char s[110];
int dp[30][110][3000];void solve()
{int knum=(1<<M);for(int i=0;i<=N;i++){for(int j=0;j<ac.L;j++){for(int k=0;k<knum;k++)dp[i][j][k]=0;}}dp[0][0][0]=1;for(int i=0;i<N;i++){for(int j=0;j<ac.L;j++){for(int k=0;k<knum;k++){if(dp[i][j][k]>0){for(int l=0;l<26;l++){int newi=i+1;int newj=ac.next[j][l];int newk=(k|ac.end[newj]);dp[newi][newj][newk]+=dp[i][j][k];dp[newi][newj][newk]%=MOD;}}}}}int ans=0;for(int i=0;i<knum;i++){if(num[i]<P) continue;for(int j=0;j<ac.L;j++){ans=(ans+dp[N][j][i])%MOD;}}printf("%d\n",ans);
}
int main()
{for(int i=0;i<(1<<10);i++){num[i]=0;for(int j=0;j<10;j++){if(i&(1<<j)) num[i]++;}}while(~scanf("%d %d %d",&N,&M,&P)){if(N==0&&M==0&&P==0) break;ac.init();for(int i=0;i<M;i++){scanf("%s",s);ac.insert(s,i);}ac.build();//  ac.debug();solve();}
}

HDU 2825 Wireless Password相关推荐

  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

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

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

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

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

    传送门 写在前面:依旧有毒的HDU,读题半天看不懂啊,感觉自动机的精通遥遥无期啊! 思路: 题意--给定m个给定的串(可能相同),要求组建一个给定长度为n的新串,要求新串中至少包含k个给定的串(序号重 ...

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

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

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

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

  7. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  8. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  9. 转自kuangbin的AC自动机(赛前最后一博)

    有了KMP和Trie的基础,就可以学习神奇的AC自动机了.AC自动机其实就是在Trie树上实现KMP,可以完成多模式串的匹配.           AC自动机 其实 就是创建了一个状态的转移图,思想很 ...

  10. kuangbin带你飞 专题1-23 题单

    kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...

最新文章

  1. Memcache内存分配策略
  2. python 正则学习笔记
  3. 如何从头开始以正确的面向对象方式创建Java Web Framework
  4. 西电计算机科学院实践中心,计算机基础教学实验中心
  5. matlab如何解不等式,如何用MATLAB求解不等式组的所有可能解
  6. Linux显卡驱动|CUDA卸载和安装|pytorch安装
  7. .NET 6 Preview 4 已发布,这些新功能值得关注!
  8. 深度学习 占用gpu内存 使用率为0_2020年深度学习最佳GPU一览,看看哪一款最适合你!...
  9. Splash特征描述子
  10. 常见的文件格式有哪些
  11. 计算机系徽 节徽设计,数学节节徽设计图
  12. 虚拟机Ubuntut tftp服务不启动,service tftpd-hpa restart 失败的处理
  13. Java FTP工具类
  14. 【路在脚下】----成长的感觉
  15. 微积分导论--Continuity
  16. 【ICPC-369】uva 12096 The SetStack Computer
  17. 小猫爪:i.MX RT1050学习笔记3-CCM
  18. DataType 数据类型
  19. 一文读懂云渲染“串流”全链路时延及优化策略
  20. 【DA9739】基于射频DAC9739的任意波形产生的性能研究

热门文章

  1. 小学身高体重测试软件,学生测量身高体重秤,小学体检秤
  2. 本地缓存下载文件,download的二次封装
  3. 洛谷P4568飞行路线(分层图最短路)
  4. 中文句法分析_句法分析StanfordParser+依存句法分析pyhanlp
  5. graphpad做单因素方差分析_如何使用Graphpad做单因素方差分析
  6. 美通企业日报 | 安踏上半年收入突破148亿元劲增超40%;猎聘8亿元战略投资问卷星...
  7. php 改变图片大小,php修改图片大小的方法
  8. ‘Staff‘ object has no attribute ‘data‘
  9. macos复制粘贴快捷键 快速_苹果MAC系统复制粘贴快捷键是什么?
  10. C Library User 手册(25)