正解: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自动机的更多相关文章

  1. [HNOI2006]最短母串问题(AC自动机+状态压缩+bfs)

    快要THUSC了,来水几道模板题吧. 这题其实是AC自动机模板.看到长度最短,首先就想到AC自动机.那么就直接暴力法来吧,把每个串建立在AC自动机上,建立fail指针,然后由于n<=12,可以把 ...

  2. 洛谷P3121 审查(黄金)Censoring(Gold) [USACO15FEB] AC自动机

    正解:AC自动机 解题报告: 传送门! 啊我好呆啊其实就挺模板题的,,,只是要一个栈搞一下,,,然后我就不会了,,,是看了题解才get的,,,QAQ 然后写下解法趴QwQ 首先看到多串匹配不难想到AC ...

  3. 【洛谷】3966:[TJOI2013]单词【AC自动机】【fail树】

    P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...

  4. 洛谷P4493 [HAOI2018]字串覆盖(后缀自动机+线段树+倍增)

    题面 传送门 题解 字符串就硬是要和数据结构结合在一起么--\(loj\)上\(rk1\)好像码了\(10k\)的样子-- 我们设\(L=r-l+1\) 首先可以发现对于\(T\)串一定是从左到右,能 ...

  5. 洛谷P2414 阿狸的打字机【AC自动机】【fail树】【dfs序】【树状数组】

    居然真的遇上了这种蔡队题.瑟瑟发抖. 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿 ...

  6. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  7. 【洛谷 P4052】 [JSOI2007]文本生成器(AC自动机,DP)

    题目链接 AC自动机上dp第一题嗷. 如果直接求可读文本的数量,显然要容斥,不好搞. 于是考虑求不可读文本的数量,再用\(26^m\)减去其即可. 建出AC自动机,如果一个节点为单词结尾或其fail链 ...

  8. [bzoj1195][HNOI2006]最短母串_动态规划_状压dp

    最短母串 bzoj-1195 HNOI-2006 题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串. 注释:$1\le n\le 12$,$1\le ...

  9. P2322 [HNOI2006]最短母串问题

    P2322 [HNOI2006]最短母串问题 AC自动机+bfs 题目要求:在AC自动机建的Trie图上找到一条最短链,包含所有带结尾标记的点 因为n<12,所以我们可以用二进制保存状态:某个带 ...

随机推荐

  1. 【django】Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

    问题描述:启动django服务时出现“Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试.”的错误 问题原因:8000端口被占用了 解决办法:默认启动的 ...

  2. 【RF库Built-In测试】Catenate

    Name:CatenateSource:BuiltIn <test library>Arguments:[ *items ]Catenates the given items togeth ...

  3. IIS中采用ISAPI-Rewrite防盗链

    本规则支持白名单排除式防盗链,搜索引擎友好(不屏蔽),被盗链后的错误提示转向,支持各种文件类型,经作者亲验真的能用,第一时间在itmop.com原创发表,请继续往下阅读. 近来小站遇到了盗链问题,至使 ...

  4. Disruptor LMAX学习

    http://lmax-exchange.github.io/disruptor/ http://bruce008.iteye.com/blog/1408075 http://code.google. ...

  5. 通过java的i/o机制进行图片流的存储以及对网络图片的存储

    存储内地图片思路:首先把原有的图片以流的方式读取出来,再以流的方式存储到目标文件: package imgStream; import java.io.*; public class ImgStrea ...

  6. Java实现简单的正则表达式匹配

    import java.util.regex.Pattern; public class Test_REG { public static void main(String[] args) { //只 ...

  7. nginx介绍和安装

    1.nginx的介绍 1.1 nginx的优势 1) 作为Web服务器,Nginx处理静态文件.索引文件,自动索引的效率非常高. 2) 作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站 ...

  8. 解决一起web 页面被劫持的案例

    现象 江西客户手机端连接wifi打开URL,页面上显示淘宝店铺广告,使用手机移动网络打开正常,其他地区正常. 二. 处理过程 初步分析:3g.club项目使用了CDN,目前只有江西异常,其他地区无异常 ...

  9. 字符串处理总结之一(C#String类)

    C#(静态String类) C#中提供了比较全面的字符串处理方法,很多函数都进行了封装为我们的编程工作提供了很大的便利.System.String是最常用的字符串操作类,可以帮助开发者完成绝大部分的字 ...

  10. HTTP协议剖析 (附HttpWatch工具监控网络请求)

    工具:HttpWatch Prov7.2.13破解版(带正版key) HTTP协议概述   思考2个要点: 第一:浏览器和服务器是通过什么连接的 第二:这种连接方式是怎么实现的   通过Interne ...