正题

题目链接:https://www.luogu.com.cn/problem/P4045


题目大意

给nnn个字符串,求有多少个长度为lll的字符串包含所有给出的字符串


解题思路

因为nnn很小,考虑状压dpdpdp,因为是包含所有字符串,考虑在ACACAC自动机上dpdpdp。

首先构造一个ACACAC自动机,wiw_iwi​表示ACACAC自动机上第iii个节点包含的字符串集合,显然wiw_iwi​是在failfailfail树上iii节点到根节点路径上所有www的异或和并加入以iii结尾的字符串。

这样我们考虑状态,fi,x,sf_{i,x,s}fi,x,s​表示填第iii个位置,现在在ACACAC自动机上的第xxx个点,目前包含的字符串状态为sss,然后进行转移即可。

考虑答案小于424242时如何输出答案,设gi,x,sg_{i,x,s}gi,x,s​表示第iii个位置,在ACACAC自动机上的第xxx个点,目前状态为sss的情况下能否转移到有解情况,然后再暴力搜索搜出所有解即可


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=110,M=1<<11;
ll l,n,cnt,ans,f[30][N][M],MS;
ll w[N],fail[N],son[N][26],t[30];
bool v[30][N][M],g[30][N][M];
queue<int> q;
void Make(char *s,ll val){ll x=0,l=strlen(s);for(ll i=0;i<l;i++){ll c=s[i]-'a';if(!son[x][c])son[x][c]=++cnt;x=son[x][c];}w[x]|=val;return;
}
void Bfs(){for(ll i=0;i<26;i++)if(son[0][i])q.push(son[0][i]);while(!q.empty()){ll x=q.front();q.pop();for(ll i=0;i<26;i++)if(!son[x][i])son[x][i]=son[fail[x]][i];else{ll y=fail[x];fail[son[x][i]]=son[y][i];q.push(son[x][i]);}w[x]|=w[fail[x]];}return;
}
bool dfs(ll i,ll x,ll s){if(v[i][x][s])return g[i][x][s];v[i][x][s]=1;if(i==l&&s==MS-1)return (g[i][x][s]=1);if(i==l)return (g[i][x][s]=0);for(ll k=0;k<26;k++)g[i][x][s]|=dfs(i+1,son[x][k],s|w[son[x][k]]);return g[i][x][s];
}
void print(ll i,ll x,ll s){if(!g[i][x][s])return;if(i==l){for(ll i=0;i<l;i++)printf("%c",t[i]+'a');putchar('\n');return;}for(ll k=0;k<26;k++)t[i]=k,print(i+1,son[x][k],s|w[son[x][k]]);return;
}
int main()
{scanf("%lld%lld",&l,&n);for(ll i=0;i<n;i++){char s[20];scanf("%s",s);Make(s,1<<i);}Bfs();MS=1<<n;f[0][0][0]=1; for(ll i=1;i<=l;i++)for(ll x=0;x<=cnt;x++)for(ll s=0;s<MS;s++){if(!f[i-1][x][s])continue;for(ll k=0;k<26;k++){ll y=son[x][k];if(i==l&&(s==1||s==3)&&y)s++,s--;f[i][y][s|w[y]]+=f[i-1][x][s];}}for(ll x=0;x<=cnt;x++)ans+=f[l][x][MS-1];printf("%lld\n",ans);if(ans<=42)dfs(0,0,0),print(0,0,0);
}

P4045-[JSOI2009]密码【AC自动机,状压dp】相关推荐

  1. HDU - 2825 Wireless Password(AC自动机+状压dp)

    题目链接:点击查看 题目大意:给出 m 个匹配串,问长度为 n 的字符串中,至少包含 k 个匹配串(可重叠)的字符串有多少个 题目分析:考虑到n,m,k都特别小,所以可以先用AC自动机将状态关系转移出 ...

  2. AC自动机+状压dp hdu2825 Wireless Password

    传送门:点击打开链接 题意:有个密码长度为n,现在有m个魔力单词,要求密码中魔力单词的种类数>=k,问这种密码的种类数. 思路:和之前一样,我们会想到AC自动机去压缩状态,把状态给简化.然后我们 ...

  3. hdu 6086 -- Rikka with String(AC自动机 + 状压DP)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  4. 【hdu2825】ac自动机 + 状压dp

    传送门 题目大意: 给你一些密码片段字符串,让你求长度为n,且至少包含k个不同密码片段串的字符串的数量. 题解: 因为密码串不多,可以考虑状态压缩 设dp[i][j][sta]表示长为i的字符串匹配到 ...

  5. HDU - 3247 Resource Archiver(AC自动机+状压dp+bfs)

    题目链接:点击查看 题目大意:给出 n 个目标串和 m 个病毒串,要求构造出一个长度最短的,且包含全部 n 个目标串,但是不能包含任意一个病毒串的01字符串,输出其最短长度 题目分析:比较综合的一道题 ...

  6. HDU - 2825 Wireless Password (AC自动机 + 状压dp)

    题目链接 题意 求至少包含KKK个给定字符串长度为NNN的字符串 思路 把所有可能的字符串建AC自动机,遍历所有节点dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示以节点jjj ...

  7. HDU - 3341 Lost's revenge(AC自动机+状压dp)

    题目链接:点击查看 题目大意:给出 n 个模式串,最后给出一个匹配串,问如何重新排列匹配串,可以使得匹配串尽可能多的匹配模式串 题目分析:因为是模式串和匹配串的匹配,所以考虑AC自动机,因为数据范围比 ...

  8. hdu 6086 Rikka with String(AC自动机+状压dp)

    题目链接:hdu 6086 Rikka with String 题意: 给你n个只含01的串,和一个长度L,现在让你构造出满足s[i]≠s[|s|−i+1] for all i∈[1,|s|] ,长度 ...

  9. [JSOI2009]密码——AC自动机+记忆化搜索(状压)

    题面 Bzoj1559 解析  要求一个能包含所有字符串的串的个数,联想到AC自动机. 每一个节点需要存一个终点信息,即以这个点为结尾的字符串编号,这个需要开一个vector来存,因为一个节点需要继承 ...

最新文章

  1. SSL/TLS原理详解
  2. TSNE 正规英文api
  3. HTML框架,列表,表格
  4. 100的阶乘c语言代码,求10000的阶乘(c语言代码实现)
  5. SHELL实战day12
  6. pytorch中上采样的实现
  7. 10月25日-10月29日一周宣讲会安排
  8. Galaxy Fold上市时间推延 屏幕瑕疵是主因
  9. c语言布线编程问题,布线问题c语言实现代码.doc
  10. 华为电脑和手机一碰传_华为手机怎么一碰传文件到电脑教程
  11. 惠普m180n故障码04_惠普m180n打印机驱动(解决m180n打印机连接问题)V1.0 免费版
  12. php文字超出省略号,文字超过规定行数时自动生成省略号
  13. Java实现DOCX文件和DOC文件互转
  14. 顺丰王国--传奇创造者
  15. 【转载】三层交换机与普通的交换机有什么区别
  16. 使用markdown编辑器
  17. 为什么要使用内存池技术?
  18. Day 8.Developing Simplified Chinese Psychological Linguistic Analysis Dictionary for Microblog
  19. 【PIC32MZ】开发环境的搭建
  20. 抖音只能上下滑动吗_仿抖音上下滑动播放视频

热门文章

  1. linux windows多任务,windows是多用户多任务系统吗?
  2. 2021福建计算机会考操作题,2021年福建省信息技术会考笔试试题答案.doc
  3. python 3.9特性_Python 3.9来了!这十个新特性值得关注
  4. 机器学习之数据预处理——归一化,标准化
  5. c++STL中的find()函数 有两种使用方法
  6. 服务器虚拟化分为半,服务器虚拟化有哪些?
  7. [数据结构]邻接矩阵和邻接表存储的图DFS,BFS算法时间复杂度分析
  8. 蓝桥杯2017初赛-油漆面积-枚举
  9. 创建型模式——原型模式
  10. python文件图标变成小电脑_手把手教你给Python程序写图形界面,并且打包成exe文件-exe文件...