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 ...
随机推荐
- spring+hibernate管理多个数据源(非分布式事务)
本文通过一个demo,介绍如何使用spring+hibernate管理多个数据源,注意,本文的事务管理并非之前博文介绍的分布式事务. 这个demo将使用两个事务管理器分别管理两个数据源.对于每一个独立 ...
- 第六节 ADO.NET
ADO.NET是一组为.NET编程人员提供数据访问服务的类,封装在System.Data.dll 中,是.NET框架的一部分,它是一种数据访问技术. 使用SQLServer数据提供程序 类 说明 Sq ...
- 并行执行的Service,以媒体转码成新格式为例
大家众所周知,IntentService内置的handler只有一个线程,而AsyncTask又只适合时间至多几秒的操作,所以我们关注使用ExecutorService建立并行执行.为了确保Servi ...
- Sql server 大全
一.基础 .说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice ...
- Error This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. T
错误提示: Severity Code Description Project File Line Suppression StateError This project references NuG ...
- linux/centos下安装nginx(rpm安装和源码安装)详细步骤
Centos下安装nginx rpm包 ...
- ZipArchive 的使用
新建一个项目,首先添加 System.IO.Compression.FileSystem 引用. 解压文件 using System.IO.Compression; namespace cl { st ...
- 字符串转与ASCII码之间的互换
1.字符串转换成ASCII码 public static String stringToAscii(String value) { StringBuffer sbu = new StringBuffe ...
- [zz] 安装PostGIS(Linux篇)
0.安装PostgreSQL数据库 参考安装PostgreSQL数据库(Linux篇). 1.安装proj4 #tar zxvf proj-4.8.0.tar.gz#cd proj-4.8.0#./c ...
- Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)C粉丝与汉诺塔
题目描述 苟利国家生死以,岂因福祸避趋之?作为ACM真正的粉丝,应该都听闻过汉诺塔问题,汉诺塔问题是这样的: 有三根柱子,编号A,B,C柱,初始情况下A柱上有n个盘子,小盘子在上大盘子在下,n个盘子大 ...