一个清晰的思路就是状压dp;不过也有AC自动机+BFS的做法

Description

给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串。

Input

第一行是一个正整数n(n<=12),表示给定的字符串的个数。
以下的n行,每行有一个全由大写字母组成的字符串。每个字符串的长度不超过50.

Output

只有一行,为找到的最短的字符串T。在保证最短的前提下,
如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个。

Sample Input

2
ABCD
BCDABC

Sample Output

ABCDABC

题目分析

状压dp

看到数据范围,自然想到状压dp。$f[t][i]$表示“已经选了$t$这个状态,第$i$个是最后一个选的”状态下最短长度。那么转移时候就是常规的状压dp转移。

至于处理两个字符串最长公共前后缀长度,我是用hash去做的。当然在AC自动机上根据fail边跳也不失为一种好方法。

 #include<bits/stdc++.h>
typedef unsigned int uint;
const int maxn = ;
const int base = ; std::string str[][maxn],s[maxn],sv[maxn],tmp;
int n,all,cnt,mn;
uint power[maxn];
int lens[maxn],num[maxn][maxn],f[][maxn]; int main()
{
memset(f, 0x3f3f3f3f, sizeof f);
scanf("%d",&n);
all = (<<n)-, power[] = ;
for (int i=; i<=n; i++)
std::cin >> s[i], lens[i] = s[i].length();
for (int i=1; i<=53; i++) power[i] = power[i-1]*base;  //之前把这个循环放在1..n的循环里了…… 以后预处理还是要小心数据范围。
for (int i=; i<=n; i++)
for (int j=; j<=n; j++)
if (i^j){
int l = std::min(lens[i], lens[j]);
uint val1 = , val2 = ;
for (int t=; t<l; t++)
{
val1 = val1+power[t]*(s[i][lens[i]-t-]-'A'+);
val2 = val2*base+s[j][t]-'A'+;
if (val1==val2) num[i][j] = t+;
}
}
mn = f[][], f[][] = ;
for (int j=, tst=; j<=n; j++, tst=<<(j-))
f[tst][j] = lens[j], str[tst][j] = s[j];
for (int p=; p<all; p++)
for (int i=, sst=; i<=n; i++, sst=<<(i-))
if (p&sst)
for (int j=, tst=; j<=n; j++, tst=<<(j-))
if (!(p&tst)){
tmp = str[p][i]+s[j].substr(num[i][j], lens[j]-num[i][j]);
if (f[p+tst][j] > f[p][i]+lens[j]-num[i][j]){
f[p+tst][j] = f[p][i]+lens[j]-num[i][j];
str[p+tst][j] = tmp;
}else if (f[p+tst][j]==f[p][i]+lens[j]-num[i][j]&&tmp < str[p+tst][j])
str[p+tst][j] = tmp;  //j和tst一开始没有分清
}
for (int i=; i<=n; i++)
if (f[all][i] < mn){
mn = f[all][i], cnt = ;
sv[cnt] = str[all][i];
}else if (f[all][i]==mn) sv[++cnt] = str[all][i];
std::sort(sv+, sv+cnt+);
std::cout << sv[];
return ;
}

AC自动机+BFS

老早就听说过这个思路,不过写完状压dp去看题解时候才好好想了想。

这个做法相对来说要抽象一些。不过也算是AC自动机的一种套路应用吧。

这里按顺序枚举保证了字典序最小;BFS保证了长度最小。

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

END

【状态压缩dp】1195: [HNOI2006]最短母串的更多相关文章

  1. bzoj 1195: [HNOI2006]最短母串 爆搜

    1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 894  Solved: 288[Submit][Status] ...

  2. BZOJ 1195: [HNOI2006]最短母串

    1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1346  Solved: 450[Submit][Status ...

  3. bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机

    LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...

  4. 1195: [HNOI2006]最短母串 - BZOJ

    Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串.Input 第一行是一个正整数n(n<=12), ...

  5. BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)

    BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...

  6. bzoj 1195: [HNOI2006]最短母串【状压dp】

    我有病吧--明明直接枚举是否匹配就可以非要写hash,然后果然冲突了(--我个非酋居然还敢用hash 设f[s][i]为已选串状态为s并且最后一个串是i,还有预处理出g[i][j]表示最长有长为g[i ...

  7. 1195: [HNOI2006]最短母串

    思路:好像以前谁问过我这题...  状个压就好啦, 把包含在其他串中的字符串删掉, 预处理除每两个字符串之间的关系, dp[ state ][ i ] 表示在state的状态下, 最后一个字符串是第i ...

  8. 【刷题】BZOJ 1195 [HNOI2006]最短母串

    Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12) ...

  9. BZOJ 1195: [HNOI2006]最短母串 AC自动机+状压+搜索

    思路比较直接. 由于 $n$ 很小,直接定义 $f[i][j]$ 表示当前在自动机中的节点 $i,$ 被覆盖串的集合为 $j$ 的方案数. #include <bits/stdc++.h> ...

随机推荐

  1. InstelliJ IDEA使用js+servlet+ajax入门

    对于Ajax,我们先了解三点(完整的JS代码在后面) 一.Ajax的出现对javascript的影响. Ajax是微软提出的一种允许客户端脚本发送HTTP请求的技术(XMLHTTP),拯救了大多数ja ...

  2. Python小世界:匿名函数、高阶函数、推导式

    前言 木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握. 另外,网上关于Python基础知识的各种普及已有太多太多. 附上相关大神的 ...

  3. C# File和fileinfo类

    两个类功能差不多,File是静态方法实现的,Fileinfo通过实例方法实现的: 文件操作例子: using System; using System.Collections.Generic; usi ...

  4. HTTP协议初识

    HTTP协议介绍 当你在浏览器地址栏敲入“http://www.cnblogs.com/”,然后猛按回车,呈现在你面前的,将是博客园的首页了(这真是废话,你会认为这是理所当然的).作为一个开发者,尤其 ...

  5. Codeforces 161C(分治、性质)

    要点 因为当前最大字符只有一个且两边是回文的,所以如果答案包含最大字符则一定是重合部分. 若不包含,则用此字符将两个区间分别断为两部分,则共有四种组合,答案一定为其中之一. #include < ...

  6. 前端CSS(3)

    前端基础CSS(3)   一.文本属性和字体属性(常用的) 1.文本属性 text-align:left|right|center|justify(两端对齐,只适用于英文);   /*对齐方式*/ c ...

  7. Token认证登录以及权限控制

    IdentityServer4实现Token认证登录以及权限控制   相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的: ...

  8. IO扩展芯片

    PCF8574:一个I2C接口+INT中断引脚口扩展出一个可输出输出的并口P0~P7,INT可以用于中断响应

  9. SpringBoot 2.x (15):Actuator监控

    Actuator监控:SpringBoot自带的,对生成环境进行监控的系统 使用:既然是监控,那就不能监控一个空项目 这里我使用SpringBoot整合MyBatis的Demo: https://ww ...

  10. css3的animation动画

    animation 设置对象的动画特效   有6个主要的值 animation-name   动画名称 animation-duration   动画持续时间 animation-timing-fun ...