hdu 2825
题解:
ac自动机+dp的题目
差不多都一个套路
记录枚举了i位,匹配到自动机上的x位,然后对于匹配了哪些单词状态压缩一下就可以了
代码:
#include <bits/stdc++.h>
using namespace std;
#define mo 20090717
int dp[][][],w[],c[][];
int cnt,fail[],pp[];
char s[];
void insert(char s[],int x)
{
int len=strlen(s),now=;
for (int i=;i<len;i++)
{
int v=s[i]-'a';
if (!c[now][v]) c[now][v]=++cnt;
now=c[now][v];
}
w[now]=<<(x-);
}
queue<int> q;
void build()
{
for (int i=;i<;i++)
if (c[][i]) fail[c[][i]]=,q.push(c[][i]);
while (!q.empty())
{
int u=q.front();q.pop();
for (int i=;i<;i++)
{
if (c[u][i])
{
fail[c[u][i]]=c[fail[u]][i];
q.push(c[u][i]);
} else c[u][i]=c[fail[u]][i];
w[c[u][i]]|=w[c[fail[u]][i]];
}
}
}
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
for (int i=;i<=;i++)
{
int l=;
for (int j=;j<=;j++)
if ((i>>j)%==) l++;
pp[i]=l;
}
int n,m,k;
while (cin>>n>>m>>k&&!(n==&&m==&&k==))
{
memset(fail,,sizeof(fail));
memset(c,,sizeof(c));
memset(w,,sizeof(w)); cnt=;
for (int i=;i<=m;i++)
{
cin>>s; insert(s,i);
}
build();
memset(dp,,sizeof(dp));
dp[][][]=;
for (int i=;i<=n;i++)
for (int j=;j<=cnt;j++)
for (int k1=;k1<=(<<m)-;k1++)
if (dp[i][j][k1])
for (int k2=;k2<;k2++)
{
int u=c[j][k2];
dp[i+][u][k1|w[u]]+=dp[i][j][k1];
dp[i+][u][k1|w[u]]%=mo; }
/* for (int i=0;i<=n;i++)
for (int j=0;j<=cnt;j++)
for (int k1=1;k1<=(1<<m)-1;k1++)
if (dp[i][j][k1])
cout<<i<<" "<<j<<" "<<k1<<endl; */
int ans=;
for (int i=;i<=(<<m)-;i++)
if (pp[i]>=k)
for (int j=;j<=cnt;j++)
{
ans+=dp[n][j][i];
ans%=mo;
}
cout<<ans<<" "<<cnt<<endl;
}
return ;
}
hdu 2825的更多相关文章
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 2825 Wireless Password (AC自己主动机,DP)
pid=2825">http://acm.hdu.edu.cn/showproblem.php? pid=2825 Wireless Password Time Limit: 2000 ...
- HDU - 2825 Wireless Password (AC自动机+状压DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2825 题意:给一些字符串,构造出长度为n的字符串,它至少包含k个所给字符串,求能构造出的个数. 题解: ...
- hdu 2825(ac自动机+状态压缩dp)
题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...
- HDU 2825 Wireless Password ( Trie图 && 状态压缩DP )
题意 : 输入n.m.k意思就是给你 m 个模式串,问你构建长度为 n 至少包含 k 个模式串的方案有多少种 分析 : ( 以下题解大多都是在和 POJ 2778 && POJ 162 ...
- HDU 2825 Wireless Password(AC自动机+DP)
题目链接 做题, #include <cstdio> #include <string> #include <cstring> using namespace st ...
- Wireless Password - HDU 2825(ac自动机+状态压缩)
题目大意:有个人想破解他邻居的密码,他邻居告诉了一些关于这个密码的信息,并且给他一个单词集合,他用这些信息判断一下最少有多少种密码. 1->, 所有的密码都是有小写字母组成. 2->,密码 ...
- hdu 2825 Wireless Password(ac自己主动机&dp)
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU - 2825 Wireless Password(AC自己主动机+DP)
Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...
- HDU 2825 AC自动机+DP
题意:一个密码,长度为 n,然后有m个magic words,这个密码至少由k个magic words组成. 问这个密码可能出现的总数. 思路:首先构造AC自动机,由于m很小,才10 ,我们可以使用二 ...
随机推荐
- toFixed方法的bug
最近在工作过程中碰到一个隐藏的bug,经调试发现竟然是toFixed函数不可靠的结果引起的.后端同学在处理价格比较的时候,用foFixed进行价格的四舍五入之后,竟然发现比较的结果有问题: 大家都知道 ...
- SNMP收集
http://velep.com/archives/416.html 协议基本格式
- C# 批量修改文件名
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- pyqt5 添加属性-类方法用属性形式访问
方法一 装饰器法 import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout,QLab ...
- python初步学习-import和datetime模块
模块 一个完整大型的python程序是由模块和包的形式组织起来的,可见模块在python中的重要性.模块是一种组织型式,它许多有关联(关系)的代码组织放到单独的独立文件中.简单的说,可以把模块理解为一 ...
- redis的底层数据机构
集群架构 参考 https://blog.csdn.net/wcf373722432/article/details/78678504 https://www.cnblogs.com/George19 ...
- Maven私服
1.关于中央仓库注意事项地址: 目前来说: http://repo1.maven.org/maven2/是真正的 Maven 中央仓库的地址,该地址内置在Maven 的源码中,其他的都是镜像.索引: ...
- Docker相关
1.理念 通过对应用组件的封装.分发.部署.运行等生命周期的管理,使用户的App(可以是一个Web应用或数据库应用等)及其运行环境能够做到“一次封装,处处运行”. 2.一句话总结 解决运行环境和配置问 ...
- CEdit使用(Edit Control控件)
CEdit使用(Edit Control控件) 编辑框只读 属性 Read Only等于 True,就有了只读效果 密码框 属性 Password 等于 True,就有了密码效果 获取值/赋予值 Up ...
- Linux系统编程【转】
转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...