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 ,我们可以使用二 ...
随机推荐
- 自动部署tomcat,并以普通用户身份运行 for centos6
#!/bin/bash ######## install jdk install_jdk () { rpm -e ‘rpm -qa |grep jdk’ wget \ --no-check-certi ...
- VS复制文件到输出目录
1.选中项目文件 2. 3.编译时就会自动创建目录,并复制文件
- TCP网络编程
TCP网络编程 与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /** * @param args * @th ...
- C语言中#ifdef,#ifndef和#endif的作用
现在规定一下头文件书写规范, 根据陈皓编写的跟我一起些makefile,一定要记住:头文件中应该只是声明,而定义应该放在C/C++文件中.否则如果出现有定义,比如头文件中有int a =2;如果有多个 ...
- Java 注解 (Annotation)你可以这样学
注解语法 因为平常开发少见,相信有不少的人员会认为注解的地位不高.其实同 classs 和 interface 一样,注解也属于一种类型.它是在 Java SE 5.0 版本中开始引入的概念. 注解的 ...
- JS禁止右键查看源码,禁止复制,复制内容到剪切板
有时候我们希望自己的网页源码不被查看,这时需要关掉鼠标的右击事件;有时候我们也希望禁止选择页面内容Ctrl+C复制. 1.禁止右键查看源码; <script> //设置右键事件 funct ...
- pycharm2018破解
1.下载 链接:https://pan.baidu.com/s/1G0C9xoUQg6JRgNQYLMIi1w 密码:2z3x 2.修改 "G:\Python\JetBrains\PyCha ...
- linux笔记_day03
1.命令行展开{} mkdir -p a/b/{c,d/e} 2.-v verbose 详细的 3.touch touch - change file timestamps 4.stat 文件 显示 ...
- jquery开发自定义的插件总结
1.第一种方式,有元素的插件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...
- Linux内存管理5---物理内存管理
1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...