题面

  Bzoj1559

解析

   要求一个能包含所有字符串的串的个数,联想到AC自动机。

  每一个节点需要存一个终点信息,即以这个点为结尾的字符串编号,这个需要开一个vector来存,因为一个节点需要继承fail节点所含的终点信息。

  再看一下数据规模,发现很小,于是可以用一个维度记录状态进行状压DP,设$dp[x][len][i]$为当前从自动机的第x号节点开始,当前状态为i(二进制下,第j位为1/0,1表示包含第j+1个字符串,0表示不包含)的长为len的合法字符串个数,显然可以记忆化搜索(当然其本质还是状压dp), 答案就是$dp[0][l][0]$。

  但如果每次都要跳fail指针的话显然不划算,于是建成trie图,即补全的AC自动机,在图上记忆化搜索。

  在$dp[0][l][0] <= 42$时需要按字典序输出字符串,当然是按照贪心的原则,并且防止走冤枉路,能走小的就走小的,不然就不走,但什么时候是能走的呢?设需要判断的节点为x,到达x时的状态为i,到达x后还剩长度为len的字符串,如果$dp[x][len][i] > 0$, 就走,否则不走。

 代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;int l, n, tot, fail[105], go[105][30];
char s[15], stak[15];
ll dp[105][30][1<<10];
vector<int> G[105];void Add(int x)
{int now = 0;int len = strlen(s);for(int i = 0; i < len; ++i){if(!go[now][s[i]-'a'])go[now][s[i]-'a'] = ++tot;now = go[now][s[i]-'a'];}G[now].push_back(x);
}queue<int> q;void Getfail()
{for(int i = 0; i < 26; ++i)if(go[0][i])q.push(go[0][i]);while(!q.empty()){int st = q.front();q.pop();for(int i = 0 ; i < 26; ++i)if(go[st][i]){q.push(go[st][i]);int t = fail[st];while(t && !go[t][i])   t = fail[t];fail[go[st][i]] = go[t][i];for(unsigned int j = 0; j < G[go[t][i]].size(); ++j){int id = G[go[t][i]][j];G[go[st][i]].push_back(id);}}elsego[st][i] = go[fail[st]][i];}
}ll dfs(int x, int rest, int stu)
{if(dp[x][rest][stu] != -1)  return dp[x][rest][stu];if(rest == 0){if(stu == (1<<n) - 1)return dp[x][rest][stu] = 1;elsereturn dp[x][rest][stu] = 0;}ll ret = 0;for(int i = 0; i < 26; ++i){int to = go[x][i];int nxt = stu;for(unsigned int j = 0; j < G[to].size(); ++j){int id = G[to][j];nxt |= (1<<(id-1));}ret += dfs(to, rest - 1, nxt);}return dp[x][rest][stu] = ret;
}void write(int x, int rest, int stu)
{if(rest == 0){printf("%s", stak+1);printf("\n");return;}for(int i = 0; i < 26; ++i){int to = go[x][i];int nxt = stu;for(unsigned int j = 0; j < G[to].size(); ++j){int id = G[to][j];nxt |= (1<<(id-1));}if(dp[to][rest-1][nxt] > 0){stak[l-rest+1] = i + 'a';write(to, rest - 1, nxt);}}
}int main()
{scanf("%d%d", &l, &n);for(int i = 1; i <= n; ++i){scanf("%s", s);Add(i);}Getfail();memset(dp, -1, sizeof(dp));dfs(0, l, 0);printf("%lld\n", dp[0][l][0]);if(dp[0][l][0] <= 42)write(0, l, 0);return 0;
}

View Code

转载于:https://www.cnblogs.com/Joker-Yza/p/11333677.html

[JSOI2009]密码——AC自动机+记忆化搜索(状压)相关推荐

  1. 交换游戏 (记忆化搜索 状压)

    链接:https://ac.nowcoder.com/acm/contest/4462/C 来源:牛客网 交换游戏 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...

  2. UVA - 10118 Free Candies(记忆化搜索/状压)

    传送门 方法一 一开始我确实是这样想的,设d[i][j][k][p][S]d[i][j][k][p][S]d[i][j][k][p][S]为四堆分别拿了i,j,k,pi,j,k,pi,j,k,p个,当 ...

  3. BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)

    传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...

  4. [蓝桥杯][2016年第七届真题]密码脱落(记忆化搜索)

    题目描述 X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其 ...

  5. 「THUPC2018」生生不息 / Lives(状压 + 记忆化搜索 + 打表)

    题目链接:https://loj.ac/problem/6398 题目大意: 生命游戏是一个经典的零玩家游戏. 游戏在一块 n \times mn×m 的方格棋盘上进行,初始时,棋盘上的一些格子中有生 ...

  6. [蓝桥杯][算法提高VIP]Sharing Chocolate(状压dp记忆化搜索)

    题目描述 每天,巧克力在它的许多形式上被全世界数百万人分享.它是一个真正普遍的糖果,实际上在世界上每个国家都能得到. 你发现唯一比吃巧克力更好的事情是把它分享给朋友.不幸的是,你的朋友非常挑剔,有着不 ...

  7. [蓝桥杯][算法提高VIP]金陵十三钗(状压dp记忆化搜索)

    题目描述 在电影<金陵十三钗>中有十二个秦淮河的女人要自我牺牲代替十二个女学生去赴日本人的死亡宴会.为了不让日本人发现,自然需要一番乔装打扮.但由于天生材质的原因,每个人和每个人之间的相似 ...

  8. 海贼王之伟大航路——状压记忆化搜索

    海贼王之伟大航路 题意: 一共 n 个点,给定任意两点的距离 dis[i,j]dis[i, j]dis[i,j]. 问,从点 1 到点 n,中途所有节点经过且仅经过一次,距离最短为多少? (2< ...

  9. UVA 1220 Party at Hali-Bula (树状DP+记忆化搜索)

    Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement from ...

最新文章

  1. wxWidgets:wxRichTextCtrl概述
  2. android webview参数,Android webView解析URL参数
  3. 热点事件发现、演化及时间线Timeline、故事线Storyline自动生成
  4. strtok_r实现方式之一
  5. CSS3制作3D水晶糖果按钮
  6. fms +fme 视频直播
  7. maven内存不足:Unexpected error occurred: Not enough memory to allocate buffers for rehashing Java heap
  8. Java全国计算机等级考试二级笔记---操作题部分
  9. Keil 5模块化编程详细步骤
  10. 计算机教室建设方案ppt,屏蔽机房建设方案.ppt
  11. Excel VBA 操作 Word(入门篇)
  12. 【OpenCV-Python-课程学习(贾)】OpenCV3.3课程学习笔记:图像色彩空间转换(cvtColor),imread()的grayscale和cvtColor()的区别、通道分离与转换
  13. 宠物商店电子商务系统er图
  14. 长沙.NET技术社区正式成立
  15. postgresql垃圾清理插件pg_repack
  16. 《牧畜王国的兴衰》序
  17. 计算机网络基础选择题
  18. centos5安装nagios
  19. YTU 3386 哈希查找2
  20. Windows7 IIS7.5部署ASP网站

热门文章

  1. 用Kotlin打造一个Router
  2. “与中国同创”支持中国成为创新的第一现场
  3. NTFS磁盘的安全与管理
  4. Recommended Journals for MPhil degree at Business Model Innovation Group
  5. 第一年的要求 工程系的研究生
  6. utf8编码-汉字几字节
  7. 大数相乘(大数阶乘模板)
  8. ZooKeeper Java Example(官方例子)
  9. 最新的Java SE平台和JDK版本发布计划
  10. Linux监控   Nagios