思路:好像以前谁问过我这题。。。  状个压就好啦, 把包含在其他串中的字符串删掉, 预处理除每两个字符串之间的关系,

dp[ state ][ i ] 表示在state的状态下, 最后一个字符串是第i个的最优解, 字典序最小的话暴力把转移过程中的字符串存下来

就好啦。

 #include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define piii pair<int, pair<int,int>> using namespace std; const int N=+;
const int M=1e4+;
const int inf=0x3f3f3f3f;
const LL INF=0x3f3f3f3f3f3f3f3f;
const int mod=1e9 + ; int n, top, up, cost[][], len[], ret[], dp1[ << ][];
string s[], t[], dp2[ << ][]; int cal(string &a, string &b, int len1, int len2) {
for(int i = max(, len2 - len1); i < len2; i++) {
bool flag = true;
for(int j = i, k = ; j < len2; j++, k++) {
if(b[j] != a[k]) {
flag = false;
break;
}
}
if(flag) {
return len1 - (len2 - i);
}
}
return len1;
} bool check(string &t) {
for(int i = ; i < top; i++) {
for(int j = ; j < s[i].size(); j++) {
string ret = s[i].substr(j, t.size());
if(ret == t) return false;
}
}
return true;
} bool cmp(const string &a, const string &b) {
return a.size() > b.size();
}
int main() {
memset(dp1, inf, sizeof(dp1));
scanf("%d", &n);
for(int i = ; i < n; i++) {
cin >> t[i];
} sort(t, t + n, cmp); for(int i = ; i < n; i++) {
if(check(t[i])) {
s[top++] = t[i];
}
} n = top; up = << n; for(int i = ; i < n; i++)
len[i] = s[i].size(); for(int i = ; i < n; i++) {
for(int j = ; j < n; j++) {
if(i == j) continue;
cost[i][j] = cal(s[i], s[j], len[i], len[j]);
}
} for(int i = ; i < n; i++) {
dp1[ << i][i] = len[i];
dp2[ << i][i] = s[i];
} for(int state = ; state < up; state++) {
for(int i = ; i < n; i++) {
if(dp1[state][i] == inf)
continue;
for(int j = ; j < n; j++) {
if((state >> j) & ) continue;
if(dp1[state ^ ( << j)][j] > dp1[state][i] + cost[j][i]) {
dp1[state ^ ( << j)][j] = dp1[state][i] + cost[j][i];
dp2[state ^ ( << j)][j] = dp2[state][i] + s[j].substr(len[j] - cost[j][i], cost[j][i]);
} else if(dp1[state ^ ( << j)][j] == dp1[state][i] + cost[j][i]) {
string ret = dp2[state][i] + s[j].substr(len[j] - cost[j][i], cost[j][i]);
if(ret < dp2[state ^ ( << j)][j])
dp2[state ^ ( << j)][j] = dp2[state][i] + s[j].substr(len[j] - cost[j][i], cost[j][i]);
}
}
}
} int id = ; for(int i = ; i < n; i++) {
if(dp1[up - ][i] < dp1[up - ][id]) {
id = i;
} else if(dp1[up - ][i] == dp1[up - ][id] && dp2[up - ][i] < dp2[up - ][id]) {
id = i;
}
} cout << dp2[up - ][id] << endl;
return ;
}
/*
*/

1195: [HNOI2006]最短母串的更多相关文章

  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. 1195: [HNOI2006]最短母串 - BZOJ

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

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

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

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

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

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

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

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

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

随机推荐

  1. 【题解】 bzoj1875: [SDOI2009]HH去散步 (动态规划+矩阵乘法)

    bzoj1875,懒得复制,戳我戳我 Solution: 看到这道题,看的出是个dp,每个点\(t\)时刻到达的方案数等于\(t-1\)到连过来的点方案数之和 但又因为题目有要求不能走一样的边回去不是 ...

  2. Spring点滴十:Spring自动装配(Autowire)

    在基于XML配置元数据,在bean的配置信息中我们可以使用<constructor-arg/>和<property/>属性来实现Spring的依赖注入.Spring 容器也可以 ...

  3. linux command ------ dmesg

    驱动开发中使用函数 printk() 打印的信息可以通过 dmesg 查看 简介 ‘dmesg’命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构.cpu.挂载的硬件,RAM等多个运 ...

  4. AngularJS 项目里使用echarts 2.0 实现地图功能

    项目中有一页是显示全国地图, echarts官网的地图实例里,有一个模拟迁徙的实例,比较符合项目需求.所以大部分配置项是参考此实例. angular 就不过多介绍了, Google出品的mvc(或者说 ...

  5. 引用EChart和Bootstrap

    1.怎么引用Echart 下载之后,写一个html,里面这样写 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  6. hdu 5956 The Elder

    http://acm.hdu.edu.cn/showproblem.php?pid=5956 转移方程:dp[i]=(dis[i]-dis[j])*(dis[i]-dis[j])+P+dp[j] 斜率 ...

  7. Mac下安装zsh(Oh My ZSH)的shell,替代原有的bash

    说明:一开始装zsh我是拒绝的,因为这个东西装简单,卸载很难,并且装了之后默认Shell的配置文件不能用了,比如~/.bashrc这些.所以在装的时候要再三考虑好! 官网:http://ohmyz.s ...

  8. 10.29训练赛第一场B题

    题目大意:有n个队伍之间比赛,每两个队伍之间都有一场比赛,因此一共有n(n-1) / 2场比赛,但是这里丢失了一场比赛的记录,现在让你通过n(n-1) /2 -1场仍然存在的比赛记录来判断丢失的那条比 ...

  9. 20165320 2017-2018-2《Java程序设计》课程总结

    20165320 2017-2017-2<Java程序设计>课程总结 一.每周作业链接汇总 1.我期待的师生关系 20165320 我期望的师生关系 2.学习基础和C语言基础调查 2016 ...

  10. Centos6.5下升级Python版本

    Cenos6.5升级Python2.6到2.7 1.下载源码包 wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz 2.进行 ...