AC自动机+状压dp

多串匹配要想ac自动机

dp[i][S]表示在i状态选中S

转移就用bfs,每个点通过fail收集信息,不要忘记通过fail传递

昨天搞不明白为什么自动机每次只可以转移儿子,不可以转移fail,问了问大概知道因为儿子是最长的后缀,包含的信息最多,包含了其他fail的信息,就相当于收集了其他fail的东西,就不用走了,但是一定要收集,这跟kmp很像,kmp就是走最大的后缀,这里也是,这样就可以保证不遗补漏同时加速

字典序最大在bfs时已经保证了,感觉比较显然,每次先拓展字典序最小的字符,bfs又求最短路,正好保证了字典序最小

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n;
char s[N];
namespace ac_automation
{
int cnt, root, tot;
int id[N];
struct DP {
short d, c;
short pre[];
DP () { d = -; }
} dp[N][ << ];
struct node {
int fail;
int ch[];
} t[N];
void ins(char *s)
{
int len = strlen(s), now = root;
for(int i = ; i < len; ++i)
{
int c = s[i] - 'A';
if(!t[now].ch[c]) t[now].ch[c] = ++tot;
now = t[now].ch[c];
}
id[now] |= << (cnt++);
}
void construct_fail()
{
queue<int> q;
for(int i = ; i < ; ++i) if(t[root].ch[i]) q.push(t[root].ch[i]);
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = ; i < ; ++i)
{
int &v = t[u].ch[i];
if(!v) v = t[t[u].fail].ch[i];
else
{
t[v].fail = t[t[u].fail].ch[i];
id[v] |= id[t[v].fail];
q.push(v);
}
}
}
}
void print(int u, int S)
{
if(u == root && S == ) return;
print(dp[u][S].pre[], dp[u][S].pre[]);
printf("%c", (char)(dp[u][S].c + 'A'));
}
void solve()
{
int a = , b = , mn = 0x3f3f3f3f;
queue<int> q;
q.push();
q.push();
dp[][].d = ;
while(!q.empty())
{
int u = q.front(); q.pop();
int S = q.front(); q.pop();
if(S == ( << n) - )
{
if(dp[u][S].d < mn)
{
a = u;
b = S;
mn = dp[u][S].d;
}
continue;
}
for(int i = ; i < ; ++i) if(t[u].ch[i])
{
int v = t[u].ch[i];
dp[v][S | id[v]].c = i;
if(dp[v][S | id[v]].d == -)
{
dp[v][S | id[v]].d = dp[u][S].d + ;
dp[v][S | id[v]].pre[] = u;
dp[v][S | id[v]].pre[] = S;
q.push(v);
q.push(S | id[v]);
}
}
}
print(a, b);
}
}
int main()
{
scanf("%d", &n);
for(int i = ; i <= n; ++i)
{
scanf("%s", s);
ac_automation :: ins(s);
}
ac_automation :: construct_fail();
ac_automation :: solve();
return ;
}

bzoj1195的更多相关文章

  1. BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...

  2. [BZOJ1195]最短母串

    1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MB Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最 ...

  3. BZOJ1195 HNOI2006最短母串(状压dp)

    按照子串出现的先后考虑.令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然.有点麻烦的是字典序,强行增加代码难度. 另一个比 ...

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

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

  5. [bzoj1195] [hnoi2006] 最短母串

    本题是一个经典的状压dp问题,在紫书中有着加强版的例题. 本题的难度主要体现在:如何输出字符串字典序最小. 为了解决这个问题,我们有两种常用方案: 1) 我们可以采用bfs输出路径的方法,使用+1来输 ...

  6. bzoj1195 神奇的ac自动机+状态压缩dp

    /* 难的不是ac自动机,是状态压缩dp 之前做了一两题类似题目,感觉理解的还不够透彻 */ #include<iostream> #include<cstdio> #incl ...

  7. BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩

    题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的 ...

  8. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...

  9. Bzoj1195 [HNOI2006]最短母串 [AC自动机]

    Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1304  Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...

  10. Bzoj1195 [HNOI2006]最短母串 [状态压缩]

    Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1304  Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...

随机推荐

  1. h5调用手机照相机

    camera.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  2. Solaris Samba服务器与DNS服务

    用于文件传输的协议,类似于ftp,ssh,只是它比其他两个好用. Samba协议 NetBIOS :一种编程接口. SMB:server message block .主要作为Microsoft网络通 ...

  3. python(2)- python程序的编写简单介绍

    一.语句和语法 # 注释 \ 转译回车,继续上一行,在一行语句较长的情况下可以使用其来切分成多行,因其可读性差所以不建议使用 : 将两个语句连接到一行,可读性差,不建议使用 : 将代码的头和体分开 语 ...

  4. Ubuntu 16.04下配置Golang开发环境

    安装之前先要明白两个变量,后面介绍安装时,会用这两个变量 GOROOT   , 这是go的工作目录,比如 /home/[替换为你的用户名]/go/work GOPATH    , 这是go的安装目录, ...

  5. jvm基础(2)

    7.类装载器 (1)class装载验证流程: A加载.这是装载类的第一个阶段,执行的动作包括:取得类的二进制流,转为方法区数据结构,在java堆中生成对应的java.lang.Class对象. B链接 ...

  6. teradata培训文档 相关索引

    teradata培训文档 http://wenku.baidu.com/view/ec44c201cc175527072208ba.html Teradata 和Greenplum 的讨论 http: ...

  7. Drupal 初次使用感受,兴许补充。

    非常久曾经就接触过.下载下来安装,结果界面太丑,太难看,直接删除. 近期又一次想到开源CMS,好奇看到那么多人推崇drupal.也便下载来又一次研究了下. 刚接触了下.只是总体使用感觉非常差.尤其几个 ...

  8. 说说设计模式~单件模式(Singleton)

    单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 从概念上来研究一下它的实现,不考虑线程安全 1 public sealed class Singlton 2 { ...

  9. EasyDarwin相关Android安卓客户端EasyPusher/EasyPlayer/EasyCamera/EasyClient在无开发环境进行log抓取

    1.抓Android logcat工具 在EasyDarwin Github Tool项目(https://github.com/EasyDarwin/Tools)下载Android adb Logc ...

  10. 当半导体的工艺制程走到7nm后

    https://mp.weixin.qq.com/s/LjFTtEKFX2o8kLjn3y6GbQ 深度学习的异构加速技术1:效率因通用而怠,构架为AI而生 一方面,当半导体的工艺制程走到7nm后,已 ...