HDU 2825 Wireless Password
题目链接:HDU-2825
题意:给出m个单词,要构造出满足包含其中大于等于k个单词的字符串,字符只包括小写字母,问长度为n的这样的串有多少个。
思路:令dp[i][j][k]表示当前已经构造了i个字符,在ac自动机上跑到结点j,且单词状态为k情况下的方案数。从dp[i][j][k]向dp[i+1]递推。注意单词可能重复出现。
代码:
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<set>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
using namespace std;
typedef long long LL;
const LL MAXN=2e3+;
const LL INF=0x3f3f3f3f;
const LL MOD=; struct AC
{
int ch[MAXN][];
vector<int> val[MAXN];
int sz;
AC() { init(); }
void init() { sz=; memset(ch[],,sizeof(ch[])); val[].clear();}
int idx(char c)
{
return c-'a';
}
void insert(char *s,int v)
{
int u=,n=strlen(s);
for(int i=;i<n;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],,sizeof(ch[sz]));
val[sz].clear();
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u].push_back(v);
}
int f[MAXN];
int last[MAXN];
void getFail()
{
queue<int> q;
f[]=;
for(int c=;c<;c++)
{
int u=ch[][c];
if(u) {f[u]=;q.push(u);last[u]=;}
}
while(!q.empty())
{
int r=q.front();q.pop();
for(int c=;c<;c++)
{
int u=ch[r][c];
if(!u)
{
ch[r][c]=ch[f[r]][c];
continue;
}
q.push(u);
int v=f[r];
while(v && !ch[v][c]) v=f[v];
f[u]=ch[v][c];
last[u]=(val[f[u]].size())?f[u]:last[f[u]];
}
}
}
};
AC T;
int f[][][];
bool isOK(int x,int k)
{
int sum=;
for(int i=;i<=;i++)
if(x&(<<i))
sum++;
return sum>=k;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
int n,m,K;
while(scanf("%d%d%d",&n,&m,&K)!=EOF && (n || m || K))
{
T.init();
for(int i=;i<=m;i++)
{
char s[];
scanf("%s",s);
T.insert(s,i);
}
T.getFail();
memset(f,,sizeof(f));
f[][][]=;
for(int i=;i<n;i++)
{
for(int j=;j<T.sz;j++)
for(int k=;k<(<<(m+));k++)
f[-i%][j][k]=;
for(int j=;j<T.sz;j++)
for(int k=;k<(<<(m+));k++)
if(f[i%][j][k])
for(int jj=;jj<;jj++)
{
int v= T.ch[j][jj];
int kk=k;
if(T.val[v].size())
{
for(unsigned int ii=;ii<T.val[v].size();ii++)
{
if((kk&(<<T.val[v][ii]))==)
kk+=(<<T.val[v][ii]);
}
}
while(T.last[v]!=)
{
v=T.last[v];
if(T.val[v].size())
{
for(unsigned int ii=;ii<T.val[v].size();ii++)
{
if((kk&(<<T.val[v][ii]))==)
kk+=(<<T.val[v][ii]);
}
}
}
v=T.ch[j][jj];
f[(i+)%][v][kk]=(f[i%][j][k]+f[(i+)%][v][kk])%MOD;
}
}
int ans=;
for(int i=;i<T.sz;i++)
for(int k=;k<(<<(m+));k+=)
if(isOK(k,K))
ans=(ans+f[n%][i][k])%MOD;
printf("%d\n",ans);
}
return ;
}
HDU 2825 Wireless Password的更多相关文章
- 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)
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 Wireless Password (AC自动机+状压DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2825 题意:给一些字符串,构造出长度为n的字符串,它至少包含k个所给字符串,求能构造出的个数. 题解: ...
- 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 ...
- HDU 2825 Wireless Password【AC自动机+DP】
给m个单词,由这m个单词组成的一个新单词(两个单词可以重叠包含)长度为n,且新单词中包含的基本单词数目不少于k个.问这样的新单词共有多少个? m很小,用二进制表示新单词中包含基本单词的情况. 用m个单 ...
- [AC自己主动机+状压dp] hdu 2825 Wireless Password
题意: 给n.m,k ,再给出m个单词 问长度为n的字符串.至少在m个单词中含有k个的组成方案有多少种. 思路: 因为m最大是10,所以能够採取状压的思想 首先建立trie图,在每一个单词的结束节点标 ...
- HDU 2825 Wireless Password(AC自动机 + 状压DP)题解
题意:m个密码串,问你长度为n的至少含有k个不同密码串的密码有几个 思路:状压一下,在build的时候处理fail的时候要用 | 把所有的后缀都加上. 代码: #include<cmath> ...
随机推荐
- oracle 11g 从 dmp 文件中导出 sql 代码 的方法.
impdp sys/password full=y dumpfile=bg.dmp nologfile=y sqlfile=bg_dmp.sql 备注: bg.dmp 是 dmp 文件, bg_d ...
- Atcoder Yahoo Programming Contest 2019 简要题解
A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...
- GridView中网络图片延迟加载导致高度计算失败的问题
在使用下拉刷新以及加载更多控件的时候,出现了列表上滚不完的现象,经过半天的分析,最后得出结论:由于图片采用了延迟加载,导致列表按照没有加载图片时候的大小进行布局,相关的加载更多控件也就傻逼了. 最终解 ...
- spark 调优——基础篇
开发调优 调优概述 Spark性能优化的第一步,就是要在开发Spark作业的过程中注意和应用一些性能优化的基本原则.开发调优,就是要让大家了解以下一些Spark基本开发原则,包括:RDD lineag ...
- imuxsock lost 353 messages from pid 20261 due to rate-limiting 解决办法
日志中出现大量一下日志时 May 24 18:42:08 yw_lvs2_backup rsyslogd-2177: imuxsock lost 353 messages from pid 20261 ...
- Java入门:一些初学者需要掌握的基础算法程序——二分查找
本例演示如何通过二分算法查找一个链表中的指定元素. import java.util.Scanner; class BinarySearchExample { public static void m ...
- P3007 [USACO11JAN]大陆议会The Continental Cowngress
P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意: 给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 "支持或反对某法案&q ...
- python反射,单例模式
# getattr# hasattr# setattr# delattr class Foo: def __init__(self, name,age): self.name = name self. ...
- 2016/1/2 Python中的多线程(1):线程初探
---恢复内容开始--- 新年第一篇,继续Python. 先来简单介绍线程和进程. 计算机刚开始发展的时候,程序都是从头到尾独占式地使用所有的内存和硬件资源,每个计算机只能同时跑一个程序.后来引进了一 ...
- jQuery中的text(),html(),val()的区别
一.jquery中HTML 1. 无参html() 方法用来获取任意元素的HTML内容,如果你调用多个选定元素的.html()方法,那么其读取的只是第一个元素,换句话说:如果选择器匹配多于一个的元素, ...