HDU - 2825 Wireless Password (AC自动机+状压DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2825
题意:给一些字符串,构造出长度为n的字符串,它至少包含k个所给字符串,求能构造出的个数。
题解:
对end[]节点标记数组进行改动,用二进制下第几位表示即为包含第几个给定子串;
状态转移方程为:dp[i+1][x][k|end[x]]=(dp[i+1][x][k|end[x]]+dp[i][j][k])%mod;(没懂为什么要用‘ | ’ ,等搞明白了在更新吧,,)
dp[i][j][l] 表示长度 i 在第j个结点且当前包含字符串集合为 l 的方案数;
- 1 #include<bits/stdc++.h>
- 2 #define ll long long
- 3 using namespace std;
- 4
- 5 const ll mod=20090717;
- 6 const ll maxn = 111;
- 7 ll ans=0;
- 8 ll sum[1100];
- 9 ll n,m,k;
- 10
- 11 struct tire{
- 12 ll nxt[maxn][30],fail[maxn],end[maxn],tot,root,vis[maxn];
- 13 ll newNode(){
- 14 for(ll i=0;i<26;i++) nxt[tot][i] = -1;
- 15 end[tot++] = 0;
- 16 return tot-1;
- 17 }
- 18 void Init(){
- 19 tot = 0;
- 20 root = newNode();
- 21 memset(dp,0,sizeof(dp));
- 22 }
- 23 void Insert(char *buf,ll id){
- 24 ll len = strlen(buf),i,u = root;
- 25 for(i=0;i<len;i++){
- 26 ll x = buf[i]-'a';
- 27 if(nxt[u][x]==-1) nxt[u][x] = newNode();
- 28 u = nxt[u][x];
- 29 }
- 30 end[u] |= 1<<id;
- 31 }
- 32 void build(){
- 33 queue <ll> q;
- 34 fail[root] = root;
- 35 for(ll i=0;i<26;i++){
- 36 if(nxt[root][i]==-1) nxt[root][i] = root;
- 37 else{
- 38 fail[nxt[root][i]] = root;
- 39 q.push(nxt[root][i]);
- 40 }
- 41 }
- 42 while(!q.empty()){
- 43 ll now = q.front();
- 44 q.pop();
- 45 for(ll i=0;i<26;i++){
- 46 if(nxt[now][i]==-1) nxt[now][i] = nxt[fail[now]][i];
- 47 else{
- 48 fail[nxt[now][i]] = nxt[fail[now]][i];
- 49 q.push(nxt[now][i]);
- 50 }
- 51 }
- 52 end[now]|=end[fail[now]];
- 53 }
- 54 }
- 55 ll dp[30][111][1<<10];
- 56 void solve(){
- 57 dp[0][0][0]=1;
- 58 for(ll i=0;i<n;i++){
- 59 for(ll j=0;j<tot;j++){
- 60 for(ll k=0;k<(1<<m);k++){
- 61 if(dp[i][j][k]){
- 62 for(ll u=0;u<26;u++){
- 63 ll x=nxt[j][u];
- 64 dp[i+1][x][k|end[x]]+=dp[i][j][k];
- 65 dp[i+1][x][k|end[x]]%=mod;
- 66 }
- 67 }
- 68 }
- 69 }
- 70 }
- 71 ans=0;
- 72 for(ll i=0;i<tot;i++){
- 73 for(ll j=0;j<(1<<m);j++){
- 74 if(dp[n][i][j]&&sum[j]>=k) ans=(ans+dp[n][i][j])%mod;
- 75 }
- 76 }
- 77 cout<<ans<<endl;
- 78 }
- 79 }ac;
- 80
- 81 char s1[maxn];
- 82
- 83 int main()
- 84 {
- 85 for(ll i=0;i<(1<<10);i++){
- 86 for(ll j=0;j<10;j++){
- 87 if(i&(1<<j)) sum[i]++;
- 88 }
- 89 }
- 90 while(cin>>n>>m>>k){
- 91 if(!n&&!m&&!k) break;
- 92 ac.Init();
- 93 for(ll i=0;i<m;i++){
- 94 cin>>s1;
- 95 ac.Insert(s1,i);
- 96 }
- 97 ac.build();
- 98 ac.solve();
- 99 }
- 100 return 0;
- 101 }
HDU - 2825 Wireless Password (AC自动机+状压DP)的更多相关文章
- hdu2825 Wireless Password(AC自动机+状压dp)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- 【HDU2825】Wireless Password (AC自动机+状压DP)
Wireless Password Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u De ...
- HDU2825 Wireless Password —— AC自动机 + 状压DP
题目链接:https://vjudge.net/problem/HDU-2825 Wireless Password Time Limit: 2000/1000 MS (Java/Others) ...
- HDU-2825 Wireless Password(AC自动机+状压DP)
题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...
- hdu 4057--Rescue the Rabbit(AC自动机+状压DP)
题目链接 Problem Description Dr. X is a biologist, who likes rabbits very much and can do everything for ...
- hdu_2825_Wireless Password(AC自动机+状压DP)
题目链接:hdu_2825_Wireless Password 题意: 给你m个串,问长度为n至少含k个串的字符串有多少个 题解: 设dp[i][j][k]表示考虑到长度为i,第j个自动机的节点,含有 ...
- HDU 2825 Wireless Password(AC自动机+DP)
题目链接 做题, #include <cstdio> #include <string> #include <cstring> using namespace st ...
- 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
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 ...
随机推荐
- uber_go_guide解析(一)
前言 实力有限,guide啃着好费劲 原地址https://github.com/xxjwxc/uber_go_guide_cn 加我自己的体会和补充 基于Golang 1.14 正文 Interfa ...
- python安装whl包时出现的问题解决:is not a supported wheel on this platform
@ 目录 一.问题 二.查找问题 三.问题解决 一.问题 1.下载一个twisted包 安装Twisted,进入https://www.lfd.uci.edu/~gohlke/pythonlibs 下 ...
- 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定
2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...
- 【Linux】kali 安装 python3 和 pip3(亲测有效)
[Linux]kali 安装 python3 和 pip3 引言: 在使用kali的时候,经常会用到各种工具以及脚本,而大多数脚本都是以python编写的,但是烦就烦在python有2个版本,有些 ...
- python模块/文件/日期时间
文件操作:
- URL重定向 - Pikachu
概述: 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方.如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能 ...
- 工作记录:记一次线上ZK掉线问题排查
目录 问题的发现 zk的情况以及分析 总结 问题的发现 最早问题的发现在于用户提的,用户提出他支付时支付失败,过了一会儿再试就好了,于是翻日志,查询到当时duboo调用出现了下类错误: [TraceI ...
- su3和SU01中参数说明
对于SU3和SU01中的的"参数"tab栏中的参数可以自己添加和删除. 所有的参数都存在表TPARA中,并且有对应的参数的说明. 那么这些参数如何使用呢? 通常的使用是,通过类似 ...
- 《进击吧!Blazor!》第一章 1.初识 Blazor
作者介绍 陈超超 Ant Design Blazor 项目贡献者 拥有十多年从业经验,长期基于.Net技术栈进行架构与开发产品的工作,Ant Design Blazor 项目贡献者,现就职于正泰集团 ...
- 02. struts2中Action名称的搜索顺序
搜索顺序 获得请求路径的URI,例如URL为:http://localhost:8080/struts2/path1/path2/path3/student.action 首先寻找namespace为 ...