洛谷P2322 最短母串问题 [HNOI2006] AC自动机
正解:AC自动机+最短路
解题报告:
这题之前考试考到辣,,,我连题目都没看懂这种傻逼事儿就不要说了QAQ
然后就港正解辣
首先这题可以用dp做?等下写
但是一般来说看到这种,第一反应就,先建个AC自动机呗
然后建完之后想怎么做呢
又有两个方法,分别港下
法一,最短路+dfs
首先想怎么样会变短呢,就是假如fail指针指向了某个串的中间一个节点,那么这个串的前面一段就可以省掉了,然后就变短了,是趴
那要保证最短,就可以直接在trie图上跑个最短路(要用spfa因为有环)
然后关于字典序最小,就用dfs暴力搜就好了
法二,利用bfs遍历
想到利用fail的时候的特点,在配fail的时候预处理出选择每个节点之后能覆盖的所有串
然后bfs地处理就好辣!
对辣有个小细节还比较难拍出来来着QAQ,,,
就是因为可能有同样的字符串,所以在建trie树的时候是|不是=
over!
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define rg register
#define rp(i,x,y) for(rg ll i=x;i<=y;++i) ll n,cnt,pre1[],pre2[],cntnod;
bool vis[][(<<)+];
struct tre{ll to[],fil,ed,lst;tre(){memset(to,,sizeof(to));ed=;fil=;}}tr[];
struct nd{ll id,tre,stat;}; inline ll read()
{
rg char ch=getchar();rg ll x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
inline void bd(string x,ll id)
{
ll lth=x.length()-,nw=;
rp(i,,lth){if(!tr[nw].to[x[i]-'A'])tr[nw].to[x[i]-'A']=++cnt;nw=tr[nw].to[x[i]-'A'];}
tr[nw].ed|=(ll)(<<id);
}
inline void fl()
{
queue<ll>Q;rp(i,,)if(tr[].to[i])Q.push(tr[].to[i]);
while(!Q.empty())
{
ll nw=Q.front();Q.pop();
//printf("nw=%lld fail=%lld last=%lld end=%lld\n",nw,tr[nw].fil,tr[nw].lst,tr[nw].ed);
rp(i,,)
{
if(tr[nw].to[i])
tr[tr[nw].to[i]].fil=tr[tr[nw].fil].to[i],
Q.push(tr[nw].to[i]),
tr[tr[nw].to[i]].lst=tr[tr[tr[nw].to[i]].fil].ed?tr[tr[nw].to[i]].fil:tr[tr[tr[nw].to[i]].fil].lst,
tr[tr[nw].to[i]].ed|=tr[tr[tr[nw].to[i]].lst].ed;
else tr[nw].to[i]=tr[tr[nw].fil].to[i];
}
}
}
inline void print(ll x){if(!x)return;print(pre1[x]);printf("%c",(char)(pre2[x]+'A'));}
inline void bfs()
{
queue<nd>Q;
Q.push((nd){,,tr[].ed});
while(!Q.empty())
{
nd nw=Q.front();Q.pop();
//printf("nw.tre=%lld nw.state=%lld nw.id=%lld\n",nw.tre,nw.stat,nw.id);
if(nw.stat==(<<n)-)return void(print(nw.id));
rp(i,,)
{
nd nodto;nodto.tre=tr[nw.tre].to[i];nodto.stat=(ll)nw.stat|tr[nodto.tre].ed;
if(vis[nodto.tre][nodto.stat])continue;
vis[nodto.tre][nodto.stat]=;nodto.id=++cntnod;pre1[nodto.id]=nw.id;pre2[nodto.id]=i;Q.push(nodto);
}
}
return;
} int main()
{
n=read();rp(i,,n){string x;cin>>x;bd(x,i-);}fl();bfs();
return ;
}
//发现命名什么的还是要下划线,,,决定开始使用下划线QwQ!
放的$code$是法二的!
洛谷P2322 最短母串问题 [HNOI2006] AC自动机的更多相关文章
- [HNOI2006]最短母串问题(AC自动机+状态压缩+bfs)
快要THUSC了,来水几道模板题吧. 这题其实是AC自动机模板.看到长度最短,首先就想到AC自动机.那么就直接暴力法来吧,把每个串建立在AC自动机上,建立fail指针,然后由于n<=12,可以把 ...
- 洛谷P3121 审查(黄金)Censoring(Gold) [USACO15FEB] AC自动机
正解:AC自动机 解题报告: 传送门! 啊我好呆啊其实就挺模板题的,,,只是要一个栈搞一下,,,然后我就不会了,,,是看了题解才get的,,,QAQ 然后写下解法趴QwQ 首先看到多串匹配不难想到AC ...
- 【洛谷】3966:[TJOI2013]单词【AC自动机】【fail树】
P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...
- 洛谷P4493 [HAOI2018]字串覆盖(后缀自动机+线段树+倍增)
题面 传送门 题解 字符串就硬是要和数据结构结合在一起么--\(loj\)上\(rk1\)好像码了\(10k\)的样子-- 我们设\(L=r-l+1\) 首先可以发现对于\(T\)串一定是从左到右,能 ...
- 洛谷P2414 阿狸的打字机【AC自动机】【fail树】【dfs序】【树状数组】
居然真的遇上了这种蔡队题.瑟瑟发抖. 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿 ...
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- 【洛谷 P4052】 [JSOI2007]文本生成器(AC自动机,DP)
题目链接 AC自动机上dp第一题嗷. 如果直接求可读文本的数量,显然要容斥,不好搞. 于是考虑求不可读文本的数量,再用\(26^m\)减去其即可. 建出AC自动机,如果一个节点为单词结尾或其fail链 ...
- [bzoj1195][HNOI2006]最短母串_动态规划_状压dp
最短母串 bzoj-1195 HNOI-2006 题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串. 注释:$1\le n\le 12$,$1\le ...
- P2322 [HNOI2006]最短母串问题
P2322 [HNOI2006]最短母串问题 AC自动机+bfs 题目要求:在AC自动机建的Trie图上找到一条最短链,包含所有带结尾标记的点 因为n<12,所以我们可以用二进制保存状态:某个带 ...
随机推荐
- 【RF库XML测试】测试的XML文件说明
文件存放路径:C:\workspace\robotframework\test_rf_api\testdata\XML.xml 文件内容: <example> <first id=& ...
- [Cubieboard] 在 Cubieboard 上安装 Node.js 和 npm
你有两个选择可以实现在Cubieboard上安装NodeJS,下载别人已经编译完成适用于Cubieboard的NodeJS二进制包,或者自己下载源码自行在Cubieboard上进行编译. 使用编译完成 ...
- lua元表(metatable)和元方法(metamethod)
(一) 元表概念: 引言:Lua中的每个值都有一套预定义的操作集合,如数字相加等.但无法将两个table相加,此时可通过元表修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定操作. 访问机制 ...
- VS05 VS08 VS10 工程之间的转换
VS05 VS08 VS10 工程之间的转换 安装了VS2010后,用它打开以前的VS2005项目或VS2008项目,都会被强制转换为VS2010的项目,给没有装VS2010的电脑带来不能打开高版本项 ...
- git切换分支(自记)
git fetch git checkout feature/A4-page
- Cookie和Session机制详解
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- phaser相关
phaser.js这个插件,中文翻译的开发文档还在翻译中,至于英文的开发文档,勉勉强强查阅,有些方法名和开发文档的有着一些区别,开发文档上时带着er的.不过大体上还是一一对应查找的到的 eg:load ...
- window下遍历并修改文件
今天需要写一个遍历文件夹下的所有文件,试了试以前的方法竟然报错了.重新改了一下. #include <iostream> #include <stdlib.h> #includ ...
- sqlserver服务器名称改成本地IP地址登录
在安装sqlserver2008.2012等时选择的是默认实例,服务器名称也就是电脑的名称,特别是登录本地的数据库,需要输入电脑用户名称加上SQLEXPRESS 例如:zhangsan\SQLEXPR ...
- SeaJS之use函数
有了 define 等模块定义规范的实现,我们可以开发出很多模块.但光有一堆模块不管用,我们还得让它们能跑起来.在 SeaJS 里,要启动模块系统很简单: <script src=”path/t ...