题目链接: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的更多相关文章

  1. HDU 2825 Wireless Password (AC自己主动机,DP)

    pid=2825">http://acm.hdu.edu.cn/showproblem.php? pid=2825 Wireless Password Time Limit: 2000 ...

  2. hdu 2825 Wireless Password(ac自己主动机&amp;dp)

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  3. HDU - 2825 Wireless Password(AC自己主动机+DP)

    Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...

  4. HDU - 2825 Wireless Password (AC自动机+状压DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2825 题意:给一些字符串,构造出长度为n的字符串,它至少包含k个所给字符串,求能构造出的个数. 题解: ...

  5. HDU 2825 Wireless Password ( Trie图 && 状态压缩DP )

    题意 : 输入n.m.k意思就是给你 m 个模式串,问你构建长度为 n 至少包含 k 个模式串的方案有多少种 分析 : ( 以下题解大多都是在和 POJ 2778 && POJ 162 ...

  6. HDU 2825 Wireless Password(AC自动机+DP)

    题目链接 做题, #include <cstdio> #include <string> #include <cstring> using namespace st ...

  7. HDU 2825 Wireless Password【AC自动机+DP】

    给m个单词,由这m个单词组成的一个新单词(两个单词可以重叠包含)长度为n,且新单词中包含的基本单词数目不少于k个.问这样的新单词共有多少个? m很小,用二进制表示新单词中包含基本单词的情况. 用m个单 ...

  8. [AC自己主动机+状压dp] hdu 2825 Wireless Password

    题意: 给n.m,k ,再给出m个单词 问长度为n的字符串.至少在m个单词中含有k个的组成方案有多少种. 思路: 因为m最大是10,所以能够採取状压的思想 首先建立trie图,在每一个单词的结束节点标 ...

  9. HDU 2825 Wireless Password(AC自动机 + 状压DP)题解

    题意:m个密码串,问你长度为n的至少含有k个不同密码串的密码有几个 思路:状压一下,在build的时候处理fail的时候要用 | 把所有的后缀都加上. 代码: #include<cmath> ...

随机推荐

  1. hdu-3308 LCIS (线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. Java考试题之四

    QUESTION 73 Given: 10: public class Hello { 11: String title; 12: int value; 13: public Hello() { 14 ...

  3. 解题:NOI 2009 管道取珠

    题面 考虑这个平方的实际意义,实际是说取两次取出一样的序列 那么设$dp[i][j][k][h]$表示第一次在上面取$i$个下面取$j$个,第二次在上面取$k$个下面取$h$个的方案数 等等$n^4$ ...

  4. jenkins权限管理,不同用户显示不同项目

    1.安装Role-based Authorization Strategy插件 系统管理-管理插件-可选插件中安装Role-based Authorization Strategy 安装后重启jenk ...

  5. Writing Genres 英文文章文体

    Description 描述文 It is painting a picture in words of a person, place, object, or scene. narration  记 ...

  6. Docker数据管理(四)

    Docker数据管理 Docker数据分为两种: 数据卷 -v /data -v src:dst 数据卷容器 --volumes-from 数据卷 案例1:我们创建一个容器,起名叫nginx-volu ...

  7. vue 配置环境遇到的问题总结

    之前Vue的官网上对于vue-cli脚手架搭建环境是这样的几步: npm install --global vue-cli vue init webpack my-project cd my-proj ...

  8. 动态规划:树形DP-景点中心(树的带权重心)

    话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个景点均有若干学生正在参 观.这n个景点以自然数1至n编号,每两个景点的编号均不同 ...

  9. numpy基础整理

    记笔记用jupyter实在太方便了,懒得再重新写到博客园上,直接放个链接吧→_→ numpy(一):https://douzujun.github.io/page/%E6%95%B0%E6%8D%AE ...

  10. Nginx错误日志与优化专题

    一.Nginx配置和内核优化 实现突破十万并发 二.一次Nignx的502页面的错误记录 (1)错误页面显示 错误日志: // :: [error] #: * recv() failed (: Con ...