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 ,我们可以使用二 ...
随机推荐
- SQL语句(四)可视化创建和修改表
可视化创建修改表 数据库(teaching)->表->新建表 数据库(teaching)->表->(右键)设计->CHECK约束->添加---->标识(名称) ...
- A+B (带有,的数字)
题目描述 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开. 现在请计算A+B的结果,并以正常形式输出. 输入描述: 输入包含多组数据数据,每组数据占一行,由 ...
- C# 实现Bresenham算法(vs2010)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- JAVA实现具有迭代器的线性表(单链表)
一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用 ...
- iscroll.js 手机上下滑动 加载更多
html <!DOCTYPE html> <html> <head> <title>下拉上拉刷新页面代码</title> <meta ...
- 自动提取文件系统---binwalk(一)
Binwalk是路由器固件分析的必备工具,该工具最大的优点就是可以自动完成指定文件的扫描,智能发掘潜藏在文件中所有可疑的文件类型及文件系统. 1.Binwalk和libmagic Binwalk的扫描 ...
- Netty入门(2) - 核心概念
Netty Crash Course 一个Netty程序一般开始于Bootstrap类,通过设置程序后,使用Handlers来处理特定的event和设置Netty中的事件,从而处理多个协议数据,比如实 ...
- PWA,SPA,MPA
PWA渐进式应用 特点: 不会部署到应用商店. 离线应用,通过设备进行存储规划 在发布了pwa的网站,浏览器会询问是否安装app到主屏. 方便分享,通过url. 可推送通知 . 通过service w ...
- 【转】Linux中包管理与定时任务
[转]Linux中包管理与定时任务 第1章 软件查询 1.1 查询软件是否安装 rpm -qa |grep cron 查询是否安装了这个软件. [root@znix ~]# rpm -qa |grep ...
- input 子系统架构总结【转】
Linux输入子系统(Input Subsystem) 转自:http://blog.csdn.net/lbmygf/article/details/7360084 Linux 的输入子系统不仅支持鼠 ...