1195: [HNOI2006]最短母串

Time Limit: 10 Sec  Memory Limit: 32 MB

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
 
题解:
一开始的确想到了状压……但是没有想到后面的操作……
而且这个题让我不得不打数组版……痛心疾首。
如果我们按照AC自动机来做这道题,我们可以这样考虑:
建好trie图之后,从根节点跑一个BFS最短路,并且按照A~Z的顺序往下走,
那么我们就实现了“最短”和“字典序最小”。
而对于字符串,我们可以用状压来记录每个串是否出现。
代码见下:
 #include<cstdio>
#include<cstring>
using namespace std;
const int K=<<;
const int N=;
short n,cnt,bit[];
char s[][],ans[N],c[N*K];
short val[N],ch[N][],f[N];
bool vis[N][K];
int from[N*K],q[N],hd,tl;
short state[N*K],point[N*K];
inline void get_fail()
{
hd=,tl=;
for(int i=;i<;i++)
if(ch[][i])q[tl++]=ch[][i];
while(hd^tl)
{
int rt=q[hd++];
for(int i=;i<;i++)
{
int u=f[rt];
if(ch[rt][i])
{
q[tl++]=ch[rt][i];
while(u&&!ch[u][i])u=f[u];
f[ch[rt][i]]=ch[u][i];
val[ch[rt][i]]|=val[ch[u][i]];
}
else
ch[rt][i]=ch[u][i];
}
}
}
inline void get_ans()
{
hd=,tl=;
while(hd^tl)
{
int u=point[hd],st=state[hd];
if(st==bit[n]-)
{
int id=;
while(hd)ans[++id]=c[hd],hd=from[hd];
while(id>=)putchar(ans[id]),id--;
return;
}
for(int i=;i<;i++)
{
if(!vis[ch[u][i]][st|val[ch[u][i]]])
{
point[tl]=ch[u][i];
c[tl]=i+'A',from[tl]=hd;
state[tl]=st|val[ch[u][i]];
vis[point[tl]][state[tl]]=;
tl++;
}
}
hd++;
}
}
int main()
{
scanf("%d",&n);
bit[]=;for(int i=;i<=n;i++)bit[i]=bit[i-]<<;
for(int i=;i<=n;i++)
{
scanf("%s",s[i]);
int rt=;int m=strlen(s[i]);
for(int j=;j<m;j++)
{
int d=s[i][j]-'A';
if(!ch[rt][d])ch[rt][d]=++cnt;
rt=ch[rt][d];
}
val[rt]|=bit[i-];
}
get_fail();get_ans();
}

[BZOJ1195]

[BZOJ1195]最短母串的更多相关文章

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

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

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

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

  3. 【状态压缩dp】1195: [HNOI2006]最短母串

    一个清晰的思路就是状压dp:不过也有AC自动机+BFS的做法 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T ...

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

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

  5. 2782: [HNOI2006]最短母串

    2782: [HNOI2006]最短母串 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3  Solved: 2[Submit][Status][Web ...

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

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

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

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

  8. [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索

    [HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...

  9. 【loj10061】最短母串

    #10061. 「一本通 2.4 练习 4」最短母串 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 1bentong 提交    提交 ...

随机推荐

  1. 让系统识别特殊字符的密码(linux)

    mysql -h主机 -u用户 -p密码 当密码是! @ # 等特殊字符是,linux无法直接识别会报错 这种情况下可以参考以下两种方法: 1.-p后面不写密码,直接回车,再输入密码即可 2.用“\” ...

  2. 关于Python的装饰器(2)

    Python中被装饰器修饰的函数,解析后会生成一个参数是被修饰函数的装饰器函数对象,可以调用,可以接受传参(如果被修饰的函数定义了参数),实际调用的时候,尽管代码里值写了被修饰的函数,被调用的却是最终 ...

  3. linux主机上,UnixBench性能测试工具使用

    1,下载  wget http://soft.laozuo.org/scripts/UnixBench5.1.3.tgz [root@VM_0_15_centos test]# [root@VM_0_ ...

  4. 在Windows2008下添加iscsi存储出现磁盘Offine(The disk is offine because of policy set by an adminstrator)的解决方法

    打开CMD命令行输入如下命令: DISKPART.EXE DISKPART> san SAN Policy : Offline Shared DISKPART> san policy=On ...

  5. K8S-RedisCluster搭建

    简介         Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接, mastart节点之间存放的数据并不是相同的,只是其中的一部分,当我们请 ...

  6. Python数据挖掘——数据概述

    Python数据挖掘——数据概述 数据集由数据对象组成: 数据的基本统计描述 中心趋势度量 均值 中位数 众数 中列数 数据集的最大值和最小值的平均 度量数据分布 极差 最大值与最小值的差 四分位数 ...

  7. Yii2 配置request组件解析 json数据

    在基础版本的config目录下 web.php 或者高级版config目录下的main.php中配置 'components' =>[ 'request' => [ 'parsers' = ...

  8. 通过Nrgok映射外网调试微信

    一.注册账号 注册地址:http://www.ngrok.cc/login 登录系统,新增域名 二.下载客户端,修改配置文件 修改ngrok.cfg auth_token值登录平台管理系统可查看 su ...

  9. 【树上DFS】Tree and Polynomials

    http://codeforces.com/gym/101372 D push1[i][k]:所有操作1总共要让节点i下推多少系数k push2[i][k]:所有操作2总共要让节点i上推多少系数k s ...

  10. Spring1()

    目的: 降低Java开发的复杂性 使用策略: 基于POJO的轻量级和最小侵入式的编程 通过依赖注入和面向接口实现松耦合 基于切面和惯例进行声明式编程 通过切面和模版减少样式代码 依赖注入:由Sprin ...