1195: [HNOI2006]最短母串 - BZOJ
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,f[i,s]表示以i开头状态为s的情况最短字符串有多长
为了比较字典序和方便的输出最终串,我们还要记录fa[i,s]表示f[i,s]的第二个字符串是哪个
var
str:array[..,..]of string;
g:array[..,..]of longint;
f,fa:array[..,..]of longint;
a:array[..]of string;
n:longint; function get(i,j:longint):string;
var
k,l:longint;
flag:boolean;
begin
for k:= to length(a[i]) do
begin
if length(a[i])-k+>length(a[j]) then continue;
flag:=true;
for l:=k to length(a[i]) do
if a[i][l]<>a[j][l-k+] then flag:=false;
if flag then
begin
get:=a[i];
for l:=length(a[i])-k+ to length(a[j]) do
get:=get+a[j][l];
g[i,j]:=length(a[i])-k+;
exit(get);
end;
end;
exit(a[i]+a[j]);
end; procedure init;
var
i,j:longint;
begin
readln(n);
for i:= to n do
readln(a[i]);
for i:= to n do
for j:= to n do
if i<>j then str[i,j]:=get(i,j);
end; var
d:array[..,..]of longint; procedure work;
var
i,j,k,head,tail,min,lastj:longint;
begin
head:=;
tail:=;
for i:= to n do
begin
inc(tail);
f[i,<<(i-)]:=length(a[i]);
d[tail,]:=i;
d[tail,]:=<<(i-);
end;
while head<=tail do
begin
for i:= to n do
if d[head,]and(<<(i-))= then
begin
if fa[i,d[head,]+<<(i-)]= then
begin
inc(tail);
d[tail,]:=i;
d[tail,]:=d[head,]+<<(i-);
fa[i,d[head,]+<<(i-)]:=d[head,];
f[i,d[head,]+<<(i-)]:=f[d[head,],d[head,]]+length(a[i])-g[i,d[head,]];
end;
if f[i,d[head,]+<<(i-)]>f[d[head,],d[head,]]+length(a[i])-g[i,d[head,]] then
begin
f[i,d[head,]+<<(i-)]:=f[d[head,],d[head,]]+length(a[i])-g[i,d[head,]];
fa[i,d[head,]+<<(i-)]:=d[head,];
end;
if f[i,d[head,]+<<(i-)]=f[d[head,],d[head,]]+length(a[i])-g[i,d[head,]] then
if str[i,fa[i,d[head,]+<<(i-)]]>str[i,d[head,]] then
begin
f[i,d[head,]+<<(i-)]:=f[d[head,],d[head,]]+length(a[i])-g[i,d[head,]];
fa[i,d[head,]+<<(i-)]:=d[head,];
end;
end;
inc(head);
end;
min:=;
for i:= to n do
if (f[i,<<n-]<min)or((f[i,<<n-]=min)and(str[i,fa[i,<<n-]]<str[j,fa[j,<<n-]])) then
begin
min:=f[i,<<n-];
j:=i;
end;
write(a[j]);
min:=<<n-;
for i:= to n- do
begin
dec(min,<<(j-));
lastj:=j;
j:=fa[j,min+<<(j-)];
for k:=g[lastj,j]+ to length(a[j]) do
write(a[j][k]);
end;
end; begin
init;
work;
end.
1195: [HNOI2006]最短母串 - BZOJ的更多相关文章
- bzoj 1195: [HNOI2006]最短母串 爆搜
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 894 Solved: 288[Submit][Status] ...
- BZOJ 1195: [HNOI2006]最短母串
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1346 Solved: 450[Submit][Status ...
- 【状态压缩dp】1195: [HNOI2006]最短母串
一个清晰的思路就是状压dp:不过也有AC自动机+BFS的做法 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T ...
- bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机
LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...
- 【刷题】BZOJ 1195 [HNOI2006]最短母串
Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12) ...
- BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)
BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...
- bzoj 1195: [HNOI2006]最短母串【状压dp】
我有病吧--明明直接枚举是否匹配就可以非要写hash,然后果然冲突了(--我个非酋居然还敢用hash 设f[s][i]为已选串状态为s并且最后一个串是i,还有预处理出g[i][j]表示最长有长为g[i ...
- BZOJ 1195: [HNOI2006]最短母串 AC自动机+状压+搜索
思路比较直接. 由于 $n$ 很小,直接定义 $f[i][j]$ 表示当前在自动机中的节点 $i,$ 被覆盖串的集合为 $j$ 的方案数. #include <bits/stdc++.h> ...
- 1195: [HNOI2006]最短母串
思路:好像以前谁问过我这题... 状个压就好啦, 把包含在其他串中的字符串删掉, 预处理除每两个字符串之间的关系, dp[ state ][ i ] 表示在state的状态下, 最后一个字符串是第i ...
随机推荐
- 核心概念 —— 契约(Contracts)
1.简介 Laravel中的契约是指框架提供的一系列定义核心服务的接口. 例如 ,Illuminate\Contracts\Queue\Queue契约定义了队列任务需要实现的方法,Illuminate ...
- [原创] CSS总结!! 有关HTML第二篇 !!
同样是拿xMind写的 明天上传 CSS+DIV 总结 今天只有CSS了 但是首先涉及一下浏览器原理: 还有好多不知道的模块 但是页面的核心模块就这些了:(些许 需要补充 请关照 ) / ...
- Convert Windows 32bit dirver to Windows 64bit
Pre-condition: 1.source code(vc6.0+WDK based) Development environment: 2.VS2013 3.WDK 8/8.1 Steps: 1 ...
- NSUserDefaults存储自定义对象
场景是这样的: 现在有一个数组如下,数组中存放着自定义的对象GoodscCategory <__NSArrayM 0x7ffb9c2032b0>( <GoodscCategory: ...
- Java的导入与导出Excel
使用Jakarta POI导入.导出Excel Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和 ...
- StringBuilder和StringBuffer
StringBuilder java.lang 类 StringBuilder java.lang.Object java.lang.StringBuilder 所有已实现的接口: Serializa ...
- Windows下Android模拟环境的搭建
- CSMA-CA介绍
本文主要介绍通讯领域中CSMA相关机制,本文全部资料来自于网络. 网络通讯,必须依靠介质来传递数据,将数据调制到模拟信号上,再把此信号通过介质传递到远方.根据介质的不同,分为有线网络和无线网络.为 ...
- Mysql单实例脚本自动化安装
安装包:mysql-5.6.31.tar.gz 已有配置文件:my.cnf *注意:本次Mysql的配置文件是在my.cnf的基础上更改得到的,my.cnf存放路径为/opt/rh/my.cnf 脚本 ...
- sed- 文本流编辑器
sed [选项] [参数] -n 被操作行打印输出 ...