洛谷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,所以我们可以用二进制保存状态:某个带 ...
随机推荐
- nginx_lua_waf 部署、测试记录
ngx_lua_waf ngx_lua_waf是一个基于lua-nginx-module(openresty)的web应用防火墙 源码:https://github.com/loveshell/ngx ...
- iOS开发-iOS7禁用手势返回
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // 禁用 iOS7 返回手势 if ([self.nav ...
- Cookie利用神器:CookieHacker
转自evilcos的博客 看到那么多苦逼的跨站师在问Cookie利用工具,不忍心,还是把自己写的Chrome扩展开源出来吧,功能极简,仿造<我的渗透利器>里提到的Original Cook ...
- [Linux] 特殊文件 /dev/zero
/dev/zero 是类 Unix 系统中一个特殊的文件,当读取该文件时,它会提供无限的空字符 null.它的一个主要用途是提供字符流来初始化数据存储,也就是使用空字符覆盖目标数据.另一个常见的用法是 ...
- php安装xdebug后var_dump输出没有格式化的问题
开发环境,装了一个xdebug扩展方便调试代码. 但是环境配置好了之后却发现xdebug加载成功了但是var_dump输出的内容却没有使用html格式化 这时想到估计是php.ini里面的某个输出的配 ...
- Bypassing PatchGuard on Windows x64
[说明] 1. 本文是意译,加之本人英文水平有限.windows底层技术属菜鸟级别,本文与原文存在一定误差,请多包涵. 2. 由于内容较多,从word拷贝过来排版就乱了.故你也可以下载附件. 3. ...
- linux进程永久放后台运行
我们使用ssh连接服务器之后,如果在执行某个命令需要时间特别长,当把终端断掉之后,命令就自动停止了一般我们在ssh客户端执行命令之后,默认他的父进程是ssh,所以把ssh终端关掉之后,子进程也就被自动 ...
- c++ 类前置声明【转】
[转自 here] 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的程序中,带注释的那行就是类B的前置说明.这是必须的,因为类A中用到了类B,而类B的声明 ...
- Excel 2010 得到当天的日期/得到一年中的第几周/得到当前一周中的星期几
=TODAY() ="第"&WEEKNUM(TODAY())&"周" =TEXT(TODAY(),"aaaa") Ctrl ...
- JVM学习--开启应用的gc日志功能
一.开启方法 For Java 1.4, 5, 6, 7, 8 pass this JVM argument to your application: -XX:+PrintGCDetails -XX: ...