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的更多相关文章

  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. 【状态压缩dp】1195: [HNOI2006]最短母串

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

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

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

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

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

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

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

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

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

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

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

  9. 1195: [HNOI2006]最短母串

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

随机推荐

  1. ActiveMQ(5.10.0) - Wildcards and composite destinations

    In this section we’ll look at two useful features of ActiveMQ: subscribing to multiple destinations ...

  2. Unity3D 之暂停和继续的实现

    Time.timeScale 时间缩放 当timeScale传递时间1.0时和实时时间一样快.当timeScale传递时间0.5时比实时时间慢一半. 当timeScale传递时间为0时游戏基本上暂停了 ...

  3. sql常识-top

    TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. 注释:并非所有的数据库系统都支持 TOP 子句. SQL Server 的语法: S ...

  4. JS实现登录页面记住密码和enter键登录

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>按 ...

  5. java访问webservice服务(一)

    欢迎转载  http://www.cnblogs.com/shizhongtao/p/3433653.html 使用wsdl2java工具命令   一. 调出命令提示符cd到cxf的解压路径“D:\学 ...

  6. PHP 魔术方法 __get __set (二)

    慢慢长寻夜,明月高空挂 __get() - 读取不可访问属性的值时,__get() 会被调用 __set() - 在给不可访问属性赋值时,__set() 会被调用 <?php /** * 清晰的 ...

  7. HTML5 内联框架iFrame

    由于现在frame和frameset很少使用,已经过时了,已经被div+CSS代替了,所以,这里只是举例说明一下,当下还在使用的内联框架iFrame 所谓的iFrame内联框架,我的理解就是在网页内部 ...

  8. aix用命令查监听端口对应的进程

    --aix$netstat -an|grep LISTEN|grep 7867tcp4 0 0 *.7867 *.* LISTEN$netstat -Aan|grep 7867f1000e00029f ...

  9. 設定 Bootstrap/SASS/Bower/gulp (Windows平台)

    請注意:在進行以下步驟前,你會需要先安裝git,可以參考這篇 git安裝教學 前言 時至今日,幾乎每個人都在討論bootstrap.less 或 sass.我們知道它們是比較新的前端技術,而且有開始愈 ...

  10. FIFO、LRU、OPT这三种置换算法的缺页次数

    考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6 当内存块数量分别为3时,试问FIFO.LRU.OPT这三种置换算法的缺页次数各是多少? 答:缺页定义 ...