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. angular 资源路径问题

    1.templateUrl .component("noData",{ templateUrl:"components/noData.html" // 注意相对 ...

  2. odoo 有哪些文档资源

    // openbook [覆盖 openerp 7 及之前版本] https://doc.odoo.com/     // 最新的 odoo documentation user[覆盖 odoo 9] ...

  3. 《UNIX-Shell编程24学时教程》读书笔记Chap3,4 文件,目录操作

    Chap3 文件操作   P28 在这章中,要着重记住一些常用的选项,要有使用正则表达式的思维,能更快达到目的.----@im天行 3.1 列文件名 .profile  sh的初始化脚本: .kshr ...

  4. 计算机的一些经典书籍CS经典书单

    c++: <c++程序设计> <c++primer> <effective c++> <more effective c++> <深入探索c++对 ...

  5. Cent OS编译环境安装

    在进行编译的时候发现总是缺少一些编译的包,安装上了一个,却又少了另一个,最后百度出来结果,记录一下: yum install gcc gcc-c++ gcc-g77 flex bison autoco ...

  6. Codeforces 490F Treeland Tour 树上的最长上升子序列

    题目链接:点击打开链接 题意: 给定n个点的树. 以下n个数表示点权. 以下n-1行给出树. 找一条链,然后找出这条链中的点权组成的最长上升子序列. 求:最长上升子序列的长度. 思路: 首先是维护一条 ...

  7. Spark 性能相关參数配置具体解释-shuffle篇

    作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 随着Spark的逐渐成熟完好, ...

  8. Google Guava之Optional优雅的使用null

    为什么使用optional 使用Optional<T>除了简化粗鲁的if(null == object).降低函数的复杂度.增加可读性之外,它是一种傻瓜式的防护,Optional<T ...

  9. eacharts 根据后台数据生成柱状图

    说明:开发环境vs2012 ,asp.net mvc4项目,c#语言 1.效果图 2.HTML 前端代码 <%@ Page Language="C#" AutoEventWi ...

  10. ElasticSearch(十二)批量查询mget

    1.批量查询的好处 就是一条一条的查询,比如说要查询100条数据,那么就要发送100次网络请求,这个开销还是很大的如果进行批量查询的话,查询100条数据,就只要发送1次网络请求,网络请求的性能开销缩减 ...