【hdu2825】ac自动机 + 状压dp

传送门

题目大意:

给你一些密码片段字符串,让你求长度为n,且至少包含k个不同密码片段串的字符串的数量。

题解:

因为密码串不多,可以考虑状态压缩

设dp[i][j][sta]表示长为i的字符串匹配到j节点且状态为sta的数量。

其中sta存储的是包含的密码串情况,在构建fail指针时,当前节点要并上fail指针所指的节点。

跑ac自动机,儿子节点从父亲节点转移。

最后取dp[len][...][sta]的和,其中sta满足二进制中1的数量>=k,

这一点可以像树状数组的lowbit那样快速求出:

inline int count(int x){int ret = 0;while(x){ret++;x -= (x & -x);}return ret;
}

code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 20, L = 20, Mod = 20090717;
int n, m, k, tot;
long long dp[30][110][1100], ans;
char s[20];
queue<int> que;
struct node{int trans[27];int fail, no;int state;inline void clear(){memset(trans, 0, sizeof trans);fail = state = no = 0;}
}trie[1010];
inline int getVal(char st){return st - 'a' + 1;
}
inline void insert(int num){int len = strlen(s + 1), pos = 1;for(int i = 1; i <= len; i++){int val = getVal(s[i]);if(!trie[pos].trans[val])trie[trie[pos].trans[val] = ++tot].clear();pos = trie[pos].trans[val];}trie[pos].state |= 1 << num;
}
inline void buildFail(){for(int i = 1; i <= 26; i++) trie[0].trans[i] = 1;que.push(1);while(!que.empty()){int u = que.front(); que.pop();for(int i = 1; i <= 26; i++){int v = trie[u].fail;while(!trie[v].trans[i]) v = trie[v].fail;int w = trie[u].trans[i];v = trie[v].trans[i];if(w){trie[w].fail = v;que.push(w);trie[w].state |= trie[v].state;}else trie[u].trans[i] = v;}}
}
inline int count(int x){int ret = 0;while(x){ret++;x -= (x & -x);}return ret;
}
inline void solve(){memset(dp, 0, sizeof dp);int limit = 1 << m;dp[0][1][0] = 1;for(int i = 1; i <= n; i++)for(int j = 1; j <= tot; j++)for(int sta = 0; sta < limit; sta++)if(dp[i - 1][j][sta])for(int l = 1; l <= 26; l++){int u = trie[j].trans[l];dp[i][u][sta | trie[u].state] = (dp[i][u][sta | trie[u].state] + dp[i - 1][j][sta]) % Mod;}for(int i = 1; i <= tot; i++)for(int sta = 0; sta < limit; sta++){if(count(sta) >= k)ans = (ans + dp[n][i][sta]) % Mod;}
}
int main(){while(scanf("%d%d%d", &n, &m, &k), n + m + k){trie[tot = 1].clear(); ans = 0;for(int i = 1; i <= m; i++){scanf("%s", s + 1);insert(i - 1);}buildFail();solve();cout << ans << endl;}
}

转载于:https://www.cnblogs.com/CzYoL/p/7450429.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

if函数 字体自动标红_发喜糖!REPT函数和图表订婚了~~

小伙伴们早上好呀&#xff01;今天为大家分享的是REPT函数的应用实例。案例1&#xff1a;基础用法左右&#xff1a;按照给定的次数重复显示文本用法&#xff1a;REPT(文本&#xff0c;重复次数)搭配&#xff1a;Wingdings字体家族的应用案例2&#xff1a;条形图⑴ 单元格D3输入…

用户体验五要素

用户体验&#xff1a; 用户在使用产品过程中建立起来的一种纯主观感受。 用户体验的重要性&#xff1a; 会失去客户&#xff1a;如果你没有良好的体验&#xff0c;用户不会使用你的产品&#xff0c;而且产品很难有二次机会接触用户。会增加获客成本&#xff1a;获客成本越来越高…

用鼠标旋转图像

这里涉及的到图像旋转后&#xff0c;方向的计算。我也不是很明白。先记录下来再说。 #_*_coding:utf-8 _*_import pygame from pygame.locals import * from sys import exit from gameobjects.vector2 import Vector2 from math import *background_image_filename./images/se…

trackingmore快递查询平台_国际快递物流信息追踪查询

以下是快递公司常用查询物流信息追踪平台1. 17TRACK查询网址&#xff1a;www.17track.net/zh-cn (强烈推荐&#xff0c;国际件都能查询)2. EMS查询网址&#xff1a;www.ems.com.cn 客服电话&#xff1a;11833. DHL网址查询&#xff1a;www.cn.dhl.com …

竞品分析该怎么做

竞品分析&#xff1a; 作用&#xff1a; 知己知彼&#xff0c;百战不殆。为自身产品设计提供功能、可用性、关键技术等方面的参考。提高自身产品的差异化程度。为新立项的产品、拍脑袋想出来的&#xff0c;降低风险。 如何选择竞品&#xff1a; 行业内领先的产品&#xff0c;通…

饿了么超时20分钟_饿了么回应“多等5分钟”,网友气炸了

广告记编辑整理(ID&#xff1a;adgroup)昨天一篇题为《外卖骑手&#xff0c;困在系统里》的文章刷屏文章指出外卖骑手是被平台系统算法与数据支配的“工具人”在系统的压迫下骑手们每天都在违反交规、与死神赛跑外卖员成了高危职业引发网友热议今天凌晨饿了么官方发布了一篇《你…

CCF历年试题总结

准备参加CCF考试&#xff0c;进行了一些试题的模拟&#xff0c;把做出的试题进行了一个汇总&#xff0c;持续更新中。 2017 201703-1 分蛋糕 转载于:https://www.cnblogs.com/shely-Wangfan/p/7452429.html

用户角色用户画像

用户角色&#xff1a; 用户角色 user personal&#xff0c;⽤户⻆⾊是⼀个集合体&#xff0c;不是指某个具体的⼈&#xff0c;是从用户群体中抽象出来的典型用户。 一般包含以下信息&#xff1a; 个人基本信息&#xff08;性别、年龄、性格、学历、婚姻、爱好、职业&#xff09…

java获取本周的开始时间和结束时间_创业板注册制开始时间/股票开户流程结束后,怎么炒股?...

股户流程刚走完&#xff0c;先别急着炒股&#xff0c;多研究股市行情。首选开户选好券商&#xff0c;没选好后患无穷&#xff0c;券商建议是富途、老虎&#xff0c;这两家美股港股都可以入&#xff0c;各有优势&#xff0c;富途的港股股票期权值得关注&#xff0c;老虎证券目前…

MarkDown 中使用 LaTeX 数学式

&#xfffc; 最近看了些机器学习的书籍, 想写点笔记记录下. 由于需要使用到很多的数学推导, 所以就看了下如何在 Markdown 中插入数学式&#xff0c;发现在 Markdown 中可以直接插入 LaTeX 数学式. 排版数学公式是 \(\TeX\) 系统设计的初衷, 在 \(\LaTeX\) 中占有特殊地位, 是…

信息架构、结构图、流程图

互联网信息架构&#xff1a; 信息架构的本质就是分类&#xff01;按照一定的规则&#xff0c;对产品的功能和内容进行组织&#xff0c;在功能确定的情况下&#xff0c;合理地设置和摆放&#xff0c;建立尽可能短的使用路径。目的就是为了更高效的满足用户的使用需求。如不进行信…

api商品分享源码_谈谈微服务中的 API 网关(API Gateway)

在本篇文章中&#xff0c;我们就一起来探讨一下 API 网关在整个微服务分布式架构中的一个作用。# 背景我们知道在微服务架构风格中&#xff0c;一个大应用被拆分成为了多个小的服务系统提供出来&#xff0c;这些小的系统他们可以自成体系&#xff0c;也就是说这些小系统可以拥有…

Docker(4)-容器互联与端口映射

容器互联 默认情况下&#xff0c;容器都是各自独立运行&#xff0c;与世隔绝。 Docker提供了一个名为docker0的虚拟网桥&#xff0c;它会为每个相连的容器分配一个虚拟子网。但是尽管容器都连在同一个虚拟网桥上&#xff0c;如果没有额外的配置&#xff0c;它们还是不能够相互通…

设计规范-导航、弹窗、视图

常见导航样式&#xff1a; 根据产品的特性&#xff0c;导航可以混合使用&#xff0c;体现形式多样化。 不能为了追求多样化&#xff0c;滥用导航类型。 扁平式导航&#xff1a; 在一级页面提供导航栏&#xff0c;一般处于顶部/底部&#xff0c;适合频繁切换的模块&#xff0c…

f3arra1n3.4.1版本_GDB 10.1版本发布了

更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)GDB的10.1版&#xff0c;即GNU调试器&#xff0c;现已发布。GDB是Ada&#xff0c;C&#xff0c;C &#xff0c;Fortran&#xff0c;Go&#xff0c;Rust等许多源代码级的调试器。GDB可以定位(调试正在运行的程序…

使用密钥登录CentOS系统(基于密钥的认证)

在Window客户端有多种软件可以登陆ssh&#xff0c;比如putty&#xff0c;xshelll&#xff0c;secureCRT&#xff0c;我就以xshell为例设置使用公钥和私钥验证登陆服务器。 使用Xshell密钥认证机制远程登录Linux 1、使用xshell生成公钥 Key Type 选择RSA &#xff08;SSH1只支持…

原型的价值与注意事项

原型的价值&#xff1a; 对于产品经理来讲在工作中原型的价值主要体现以下三个部分&#xff1a; 在原型设计阶段花费的时间&#xff0c;可以避免额外的工作&#xff0c;节省总体时间、精力和成本。 原型是展示、讲述、体验之源&#xff0c;常用于做早期评审&#xff0c;以确保…

华为8545m5补全shell_华为hs8145v5 改华为界面和默认超密(一)

重点从电信界面改华为界面要点&#xff1a;修改配置文件必须要有 Root 权限&#xff0c;也就是要能登陆 Telnet 和补全 Shell 。开 Telnet 方法&#xff1a;1.需要有超密&#xff0c;登陆到电信管理页面&#xff0c;打开 Telnet 选项。在后台页面点击“安全”--->“ONT访问控…

08、单链表编程考点

单链表编程考点 1、将单链表的第一个结点放在单链表的最后一个结点的后面 /* 设h是无头结点的单链表&#xff0c;如果线性表h的长度不小于2&#xff0c;则将首元结点删除并插入到表尾 将单链表的第一个结点放在单链表的最后一个结点的后面 */ typedef struct node {elementype …

ios nstimer实现延时_iOS中定时器NSTimer的使用

1、初始化 (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector us…