最短母串 bzoj-1195 HNOI-2006

题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串。

注释:$1\le n\le 12$,$1\le max length \le 50$。

想法:刚开始在那里AC自动机半天,然后瞅了一眼数据范围... ...状压吧兄弟!!

首先,我们先做一些预处理:把可以被字符集中串包含的串都删掉;求出两个字符串连接后的长度(这个预处理暴力即可),设merge[i][j]表示串i和串j合并后的长度。

状态:dp[s][i]表示这个串已经包含了s状态的字符串且紧跟着的串是i的最短长度。

转移:dp[s][i]=min{dp[s^(1<<(j+1))][j]+merge[i][j]-length(j)};

最后,附上丑陋的代码... ...

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
const int mxn=61;
int n;
struct bind
{
char s[605];
int len;
bool operator < (const bind y) const
{
if(len!=y.len)return len<y.len;
for(int i=0;i<len;i++)
if(s[i]!=y.s[i])return s[i]<y.s[i];
return 0;
}
}f[1<<12][12],s[12];
int c[13][13];
bool ban[mxn]; bool ovl(int i,int j)
{
if(s[i].len<s[j].len)return 0;
char *p=strstr(s[i].s,s[j].s);
if(p==NULL)return 0;
return 1;
}
int clc(int x,int y)
{
bool flag=0;
for(int i=max(0,s[x].len-s[y].len);i<s[x].len;i++)
{
flag=1;
for(int j=i;j<s[x].len;j++)
if(s[x].s[j]!=s[y].s[j-i]){flag=0;break;}
if(flag)return s[x].len-i;
}
return 0;
}
bind merge(int S,int u,int v)
{
bind tmp=f[S][u];
strcat(tmp.s,s[v].s+c[u][v]);
tmp.len=f[S][u].len-c[u][v]+s[v].len;
return tmp;
}
void Dp()
{
int i,j,ed=(1<<n)-1;
for(i=0;i<=ed;i++)
for(j=0;j<n;j++)f[i][j].len=INF;
for(i=0;i<n;i++)f[1<<i][i]=s[i];
for(i=1;i<=ed;i++)
{
for(j=0;j<n;j++)
{
if((i>>j)&1)
for(int k=0;k<n;k++)
{
if((i>>k)&1) continue;
bind tmp=merge(i,j,k);
if(tmp<f[i|(1<<k)][k])f[i|(1<<k)][k]=tmp;
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%s",s[i].s),s[i].len=strlen(s[i].s);
for(int i=0;i<n;i++)
for(j=0;j<n;j++)
if(i!=j && ovl(i,j) && !ban[i])ban[j]=1;
int cnt=0;
for(int i=0;i<n;i++)if(!ban[i])s[cnt++]=s[i];
n=cnt;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(i!=j)c[i][j]=clc(i,j);
Dp();
int ans=0,ed=(1<<n)-1;
for(int i=1;i<n;i++)
if(f[ed][i]<f[ed][ans])ans=i;
printf("%s",f[ed][ans].s);
return 0;
}

小结:看到了数据做题是一种解题想法,但是考试的时候看数据范围猜复杂度我tm就没成功过... ...

[bzoj1195][HNOI2006]最短母串_动态规划_状压dp的更多相关文章

  1. [HNOI2006]最短母串问题——AC自动机+状压+bfs环形处理

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

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

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

  3. Bzoj1195 [HNOI2006]最短母串 [状态压缩]

    Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1304  Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...

  4. BZOJ1195 [HNOI2006]最短母串 【状压dp】

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

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

    Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1304  Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...

  6. BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...

  7. BZOJ1195 HNOI2006最短母串(状压dp)

    按照子串出现的先后考虑.令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然.有点麻烦的是字典序,强行增加代码难度. 另一个比 ...

  8. [BZOJ1195]:[HNOI2006]最短母串(AC自动机+BFS)

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

  9. BZOJ1195: [HNOI2006]最短母串(Trie图,搜索)

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

随机推荐

  1. bzoj4950: [Wf2017]Mission Improbable

    跟着靖靖做题%%%%% 这题一看就觉得和之前的某场模拟赛的一道题很像,找假如某行某列的最大值一样的就可以只堆一个,跑匈牙利就行 一开始以为箱子不能移动-_-! 然后有个坑,大家都知道当这个位置有箱子就 ...

  2. C#上移,下移TreeView中的树节点顺序

    C#上移,下移TreeView中的树节点顺序 2009-08-12 20:10 1494人阅读 评论(2) 收藏 举报 c#buttonobjectnullstring C#中,通过单击上移,下移按钮 ...

  3. Codeforces--630I--Parking Lot(规律)

     I - Parking Lot Crawling in process... Crawling failed Time Limit:500MS     Memory Limit:65536KB  ...

  4. nyoj--496--巡回赛(拓扑排序)

    巡回赛 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 世界拳击协会(WBA)是历史最悠久的世界性拳击组织,孕育了众多的世界冠军,尤其是重量级,几乎造就了大家耳熟能详的所 ...

  5. CentOS7 网卡名称重命名为eth*

    CentOS7 禁用网卡名称命名规则,启动时传递"net.ifnames=0 biosdevname=0"/etc/default/grupgrup2-mkconfig -o /b ...

  6. 75.培训管理-培训信息发布 Extjs 页面

    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&quo ...

  7. Linux防火墙设置

    对于Internet上的系统,不管是什么情况都要明确一点:网络是不安全的.因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的. Linux提供了一个非常优秀的防火墙工具-netfil ...

  8. PCB LDI文件 自动化输出(改造)实现思路

    由于工厂采用Liunxs系统输出LDI文件,由于我们数据库是用的Windows Server,编程语言是.net 无法与Liunxs系统进行有效对接, 所以造成才会造成LDI 资料输效率极低,人员工作 ...

  9. PCB MS SQL 行转列

    一.原数据: SELECT inman,indate FROM [fp_db].[dbo].[ppezhpbb] WHERE indate > '2016-5-1' AND indate < ...

  10. Gym - 101208J 2013 ACM-ICPC World Finals J.Pollution Solution 圆与多边形面积交

    题面 题意:给你一个半圆,和另一个多边形(可凹可凸),求面积交 题解:直接上板子,因为其实这个多边形不会穿过这个半圆,所以他和圆的交也就是和半圆的交 打的时候队友说凹的不行,不是板题,后面想想,圆与多 ...