1195: [HNOI2006]最短母串
思路:好像以前谁问过我这题。。。 状个压就好啦, 把包含在其他串中的字符串删掉, 预处理除每两个字符串之间的关系,
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]最短母串的更多相关文章
- 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个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...
- 1195: [HNOI2006]最短母串 - BZOJ
Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串.Input 第一行是一个正整数n(n<=12), ...
- 【刷题】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> ...
随机推荐
- 【刷题】BZOJ 2001 [Hnoi2010]City 城市建设
Description PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少 ...
- 解题:APIO 2018 铁人两项
题面 建立圆方树,考虑所有路径,发现路径上原来的点双(现在的方点)里的点都可以做中间点.但是路径上被方点夹着的圆点被计重了,要扣掉:枚举的两个端点也被算进去了,要扣掉.所以直接将方点权值设为点双大小, ...
- Andrew Ng机器学习课程,第一周作业,python版本
Liner Regression 1.梯度下降算法 Cost Function 对其求导: theta更新函数: 代码如下: from numpy import * import numpy as n ...
- CSUOJ 1170 A sample problem
J: A Simple Problem Submit Page Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 87 S ...
- C++11 & C++14 & C++17新特性
C++11:C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. 新的关键字 auto C++11中引入auto第一种作用是为了自动类型推导 ...
- Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...
- Lua程序设计(一)面向对象概念介绍
完整代码 local mt = {} mt.__add = function(t1,t2) print("两个Table 相加的时候会调用我") end local t1 = {} ...
- artTemplate
1.http://www.cnblogs.com/jiqiyoudu/p/4588042.html
- [转载]为什么有些MP4文件在Chrome浏览器上播放不了?
http://blog.sina.com.cn/s/blog_6bb7ebcc0101c2ja.html Chrome浏览器支持HTML5,它支持原生播放部分的MP4格式(不用通过Flash等插件). ...
- 基于序列化技术(Protobuf)的socket文件传输
好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...