题目大意:给定一个字符串集,求一个最短字串,使得该集合内的串都是该串的一个子串

算法:AC自动机+最短路+状压DP

注意空间限制

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
#include"bitset"
#include"string"
using namespace std; const int MAXN=13;
const int MAXM=55;
const int siz=26; int n,cnt,minn;
string ans;
short q[MAXN*MAXM*siz];
int ln[MAXN*MAXM],f[MAXN][MAXN],I[MAXN][1<<12];
string G[MAXN*MAXM],g[MAXN][MAXN],H[MAXN][1<<12];
int rid[MAXN];
char ch[MAXM*MAXN];
bitset<MAXN*MAXM> vis;
struct rpg{
int fail;
int sn[siz];
}T[MAXN*MAXM]; void ins(char *ch,int id)
{
int ln=strlen(ch+1),nw=0;
for(int i=1;i<=ln;++i){
if(!T[nw].sn[ch[i]-'A']) T[nw].sn[ch[i]-'A']=++cnt;
nw=T[nw].sn[ch[i]-'A'];
}rid[id]=nw;
return;
} void Getfail()
{
int hd=1,tl=0;
for(int i=0;i<siz;++i) if(T[0].sn[i]) q[++tl]=T[0].sn[i];
while(hd<=tl){
int nw=q[hd++];
for(int i=0;i<siz;++i){
if(T[nw].sn[i]){
T[T[nw].sn[i]].fail=T[T[nw].fail].sn[i];
q[++tl]=T[nw].sn[i];
}else T[nw].sn[i]=T[T[nw].fail].sn[i];
}
}return;
} void SPFA(int s)
{
int hd=1,tl=1;
memset(ln,0x7f,sizeof(ln));
for(int i=1;i<=cnt;++i) G[i].clear();
q[hd]=s;ln[s]=0;vis[s]=1;
while(hd<=tl){
int nw=q[hd++];vis[nw]=0;
if(ln[T[nw].fail]>ln[nw]){
ln[T[nw].fail]=ln[nw];
G[T[nw].fail]=G[nw];
if(!vis[T[nw].fail]){
vis[T[nw].fail]=1;
q[++tl]=T[nw].fail;
}
}for(int i=0;i<siz;++i){
string str=G[nw]+(char)(i+'A');
if(ln[T[nw].sn[i]]<ln[nw]+1) continue;
if(ln[T[nw].sn[i]]>ln[nw]+1){
ln[T[nw].sn[i]]=ln[nw]+1;
G[T[nw].sn[i]]=str;
if(!vis[T[nw].sn[i]]){
vis[T[nw].sn[i]]=1;
q[++tl]=T[nw].sn[i];
}
}if(G[T[nw].sn[i]]<=str) continue;
G[T[nw].sn[i]]=str;
if(!vis[T[nw].sn[i]]){
vis[T[nw].sn[i]]=1;
q[++tl]=T[nw].sn[i];
}
}
}return;
} void res()
{
SPFA(0);
for(int i=1;i<=n;++i){
f[0][i]=ln[rid[i]];
g[0][i]=G[rid[i]];
}for(int i=1;i<=n;++i){
SPFA(rid[i]);
for(int j=1;j<=n;++j){
f[i][j]=ln[rid[j]];
g[i][j]=G[rid[j]];
}
}return;
} void slv()
{
memset(I,0x7f,sizeof(I));
for(int i=1;i<=n;++i) I[i][1<<i-1]=f[0][i],H[i][1<<i-1]=g[0][i];
for(int i=1;i<1<<n;++i){
for(int j=1;j<=n;++j){
if((i>>j-1)&1==0) continue;
for(int k=1;k<=n;++k){
if((i>>k-1)&1) continue;
if(I[k][i|(1<<k-1)]<I[j][i]+f[j][k]) continue;
if(I[k][i|(1<<k-1)]>I[j][i]+f[j][k]){
I[k][i|(1<<k-1)]=I[j][i]+f[j][k];
H[k][i|(1<<k-1)]=H[j][i]+g[j][k];
}else if(H[k][i|(1<<k-1)]>H[j][i]+g[j][k]){
H[k][i|(1<<k-1)]=H[j][i]+g[j][k];
}
}
}
}ans=H[1][(1<<n)-1],minn=I[1][(1<<n)-1];
for(int i=2;i<=n;++i){
if(minn>I[i][(1<<n)-1]){
minn=I[i][(1<<n)-1];
ans=H[i][(1<<n)-1];
}else if(minn==I[i][(1<<n)-1]&&ans>H[i][(1<<n)-1]){
ans=H[i][(1<<n)-1];
}
}return;
} int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%s",ch+1),ins(ch,i);
Getfail();res();slv();
cout<<ans<<endl;
return 0;
}

[HNOI2006]最短母串问题的更多相关文章

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

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

  2. 2782: [HNOI2006]最短母串

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

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

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

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

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

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

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

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

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

  7. BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图

    BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2, ...

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

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

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

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

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

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

随机推荐

  1. CentOS7打开关闭防火墙与端口

    http://www.javahelp.com.cn/h-nd-747.html#_np=153_1707

  2. php 内存分配新

    https://yq.aliyun.com/articles/38307 https://yq.aliyun.com/ziliao/132720 http://blog.liyiwei.cn/%E3% ...

  3. 《Implementing QuantLib》译后记

    目录 <Implementing QuantLib>译后记 初心 瞎忙 收获 彩蛋 展望 就在几天之前,经历了一年时间断断续续的坚持,<Implementing QuantLib&g ...

  4. linux 多线程之间信号传递

    函数 sigwait sigwait的含义就如同它的字面意思:等待某个信号的到来.如果调用该函数的线程没有等到它想等待的信号那么该线程就休眠.要达到等到一个信号,我们得做下面的事: 首先,定义一个信号 ...

  5. 踩方格 OpenJ_Bailian - 4103

    有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设:a.    每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b.    走过的格子立即塌陷无法再走第二次:c.    只能向北.东.西三个 ...

  6. [性能测试]:内存泄漏以及MAT(Memory Analyzer Tool)工具使用分析

    一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...

  7. 用js制作简易计算器及猜随机数字游戏

    <!doctype html><html><head> <meta charset="utf-8"> <title>JS ...

  8. Mac 10.12安装窗口快速缩放到一定比例的工具Moom

    说明:比如想要窗口只占用屏幕的一半时,我们的做法就是手动调节,而这款软件已经有快速按钮点一下即可. 下载: (链接: https://pan.baidu.com/s/1gfguJth 密码: wqjb ...

  9. Mac 10.12安装XMind

    下载: (链接: https://pan.baidu.com/s/1i4FmspJ 密码: ydc2)

  10. Normalize.css – HTML5-ready 的css重置样式集

    Normalize.css 是一个可定制的 css文件,使浏览器呈现的所有元素,更一致和符合现代标准.它正是针对只需要统一的元素样式.该项目依赖于研究浏览器默认元素风格之间的差异,精确定位需要重置的样 ...