链接

状压dp+ac

dp[i+1][next[j]][st|tt]表示第i+1长度结点为next[j]状态为st|tt的时候的ans;

dp[i+1][next[j]][st|tt]+=dp[i][j][tt]; st记录当前结点是否为给定单词的结束点

后一维用01状态表示截止到目前结点为止所包含的单词数量。

需要修改ac模板的一个地方,val[u]|=val[fail[u]];

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 115
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
const int child_num = ;
const int mod = ;
class AC
{
private:
int ch[N][child_num];
int fail[N];
int Q[N];
int val[N];
int sz;
int id[];
int dp[][N][<<];
public:
void init()
{
fail[] =;
for(int i = ;i < child_num ; i++)
id[i+'a'] = i;
}
void reset()
{
memset(val,,sizeof(val));
memset(ch[],,sizeof(ch[]));
//memset(fail,0,sizeof(fail));
sz = ;
}
void insert(char *a,int key)
{
int p = ;
for(; *a ; a++)
{
int d = id[*a];
if(ch[p][d]==)
{
memset(ch[sz],,sizeof(ch[sz]));
ch[p][d] = sz++;
}
p = ch[p][d];
}
val[p] = (<<key);
}
void construct()
{
int i,head=,tail = ;
for(i = ;i < child_num ; i++)
{
if(ch[][i])
{
fail[ch[][i]] = ;
Q[tail++] = ch[][i];
}
}
while(head!=tail)
{
int u = Q[head++];
val[u]|=val[fail[u]];
for(i = ;i < child_num ;i++)
{
if(ch[u][i])
{
fail[ch[u][i]] = ch[fail[u]][i];
Q[tail++] = ch[u][i];
}
else ch[u][i] = ch[fail[u]][i];
}
}
}
void work(int n,int k,int m)
{
int i,j,g,o;
for(i = ; i <= n ;i++)
for(j = ; j <= sz ; j++)
for(g = ;g <=(<<m) ; g++)
dp[i][j][g] = ;
dp[][][] = ;
for(i = ; i < n ;i++)
for(j = ; j < sz ; j++)
{
for(int e = ; e < (<<m) ; e++)
{
if(!dp[i][j][e]) continue;
for(g = ;g < child_num ; g++)
{
o = ;
if(val[ch[j][g]])
{
o = val[ch[j][g]];
}
dp[i+][ch[j][g]][e|o]=(dp[i+][ch[j][g]][e|o]+dp[i][j][e])%mod;
}
}
}
int ans = ;
for(i = ; i < sz;i ++)
{
for(j = ;j < (<<m) ; j++)
{
if(!dp[n][i][j]) continue;
int o = ;
for(g = ;g < m ; g++)
if(j&(<<g)) o++;
if(o>=k)
ans = (ans+dp[n][i][j])%mod;
}
}
printf("%d\n",ans);
}
}ac;
char vir[];
int main()
{
int n,m,k,i;
ac.init();
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
if(!n&&!m&&!k) break;
ac.reset();
for(i = ; i <= m; i++)
{
scanf("%s",vir);
ac.insert(vir,i-);
}
ac.construct();
ac.work(n,k,m);
}
return ;
}

hdu2825Wireless Password(ac+dp)的更多相关文章

  1. 【hdu2825-Wireless Password】AC自动机+DP

    http://acm.hust.edu.cn/vjudge/problem/16883 题意:要构造一个长度为n的字符串,然后有m模板串构成一个集合(m<=10),构造出来的字符串至少含有k种模 ...

  2. 【HDU2825】Wireless Password (AC自动机+状压DP)

    Wireless Password Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u De ...

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

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

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

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

  5. hdu_2825_Wireless Password(AC自动机+状压DP)

    题目链接:hdu_2825_Wireless Password 题意: 给你m个串,问长度为n至少含k个串的字符串有多少个 题解: 设dp[i][j][k]表示考虑到长度为i,第j个自动机的节点,含有 ...

  6. HDU2825 Wireless Password —— AC自动机 + 状压DP

    题目链接:https://vjudge.net/problem/HDU-2825 Wireless Password Time Limit: 2000/1000 MS (Java/Others)    ...

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

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

  8. hdu2825 Wireless Password(AC自动机+状压dp)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

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

    题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...

随机推荐

  1. Linux内核设计第八周 ——进程的切换和系统的一般执行过程

    Linux内核设计第八周 ——进程的切换和系统的一般执行过程 第一部分 知识点总结 第二部分 实验部分 1.配置实验环境,确保menu内核可以正常启动 2.进入gdb调试,在shedule和conte ...

  2. mui待解决问题

    $.plusReady(function () { });  里面的方法不执行: plusReady仅在5+ App或流应用中会触发 plusReady 参考网址: http://ask.dcloud ...

  3. linux下对date和timestamp的互转

    1. date 到 timestamp: $ date -d '2009-12-01 23:20' +%s 12596808002. timestamp 到 date$ date -d '1970-0 ...

  4. CSS典型案例实践

    CSS案例实践 一.层布局:定位元素重叠 在CSS中可以通过z-index属性来确定定位元素的层叠等级.需要注意的是: z-index属性只有在元素的position属性取值为relative.abs ...

  5. MongoDB安装并设置为windows服务以使其开机自启

    在MongoDB的官方下载windows平台的压缩zip文件,地址:https://www.mongodb.org/dr/fastdl.mongodb.org/win32/mongodb-win32- ...

  6. Linux Shell编程基础

    在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐 ...

  7. RabbitMQ学习总结 第三篇:工作队列Work Queue

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  8. 安装django

    我已经有Python3.5的环境了.我们去下载Django.https://github.com/django/django.git  直接下载为zip解压即可. 然后在命令提示符下安装 1.  切换 ...

  9. 12. 星际争霸之php设计模式--模板模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  10. OAuth2.0概述

    OAuth2.0较1.0相比,整个授权验证流程更简单更安全,也是未来最主要的用户身份验证和授权方式. 关于OAuth2.0协议的授权流程可以参考下面的流程图,其中Client指第三方应用,Resour ...