bzoj1195
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的更多相关文章
- BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...
- [BZOJ1195]最短母串
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MB Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最 ...
- BZOJ1195 HNOI2006最短母串(状压dp)
按照子串出现的先后考虑.令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然.有点麻烦的是字典序,强行增加代码难度. 另一个比 ...
- [bzoj1195][HNOI2006]最短母串_动态规划_状压dp
最短母串 bzoj-1195 HNOI-2006 题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串. 注释:$1\le n\le 12$,$1\le ...
- [bzoj1195] [hnoi2006] 最短母串
本题是一个经典的状压dp问题,在紫书中有着加强版的例题. 本题的难度主要体现在:如何输出字符串字典序最小. 为了解决这个问题,我们有两种常用方案: 1) 我们可以采用bfs输出路径的方法,使用+1来输 ...
- bzoj1195 神奇的ac自动机+状态压缩dp
/* 难的不是ac自动机,是状态压缩dp 之前做了一两题类似题目,感觉理解的还不够透彻 */ #include<iostream> #include<cstdio> #incl ...
- BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩
题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的 ...
- 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路
原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...
- Bzoj1195 [HNOI2006]最短母串 [AC自动机]
Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1304 Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...
- Bzoj1195 [HNOI2006]最短母串 [状态压缩]
Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1304 Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...
随机推荐
- MySQL 压缩解决方案
From:https://www.qcloud.com/community/article/876100 导语 描述 MySQL 压缩的使用场景和解决方案,包括压缩传输协议.压缩列解决方案和压缩表解决 ...
- bootstrap之鼠标操作
TouchLongClick package io.appium.android.bootstrap.handler; import android.os.SystemClock; import co ...
- 【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1117/120.html 作者:毛星云 ...
- node开发后将本地mysql数据导入到服务器mysql
近期写的一个钉钉企业微应用用到了mysql数据库(用koa写的后台,并用mysql库来连接),现在需要把本地数据库的数据导入到服务器的数据库中. 服务器安装mysql 可以google篇centos的 ...
- php判断某字符串是否不以数字或其他特殊字符开头
if(preg_match("/^[^\d-.,:]/",$addr)){ echo $addr.'不是数字或其他特殊字符开头'; }
- 问题 “cell 出栈 selectBox 已选的图标,被释放掉,再次进入屏幕时,没有了已选图标 ” 解决方案
如何 去解决 列表里面的selectBox已选情况,在滑出屏幕后被清除的问题. 我来在这里 详细说明一下, 在cell里面写一个方法,去专门修复滑出后,又滑进来 图标被冲刷掉的cell. 在 ...
- css常用总结
1.固定一个层在页面的位置,不受滚动条影响, 属性position:fixed,如: .tbar{ height:200px;width:60px;background-color:#666;posi ...
- 九度OJ 1137:浮点数加法 (大数运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2725 解决:736 题目描述: 求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2...Pi.Q1Q2...Qj ...
- Colly provides a clean interface to write any kind of crawler/scraper/spider
Scraping Framework for Golang http://go-colly.org/ https://github.com/gocolly/colly package main imp ...
- mybatis是什么?(二)
mybatis是什么? mybatis是一个持久层的框架,是apache下的顶级项目. mybatis托管到goolecode下,再后来托管到github下(https://github.com/my ...