dp-LCS(递归输出最短合串)】的更多相关文章

Problem Description The company "21st Century Fruits" has specialized in creating new sorts of fruits by transferring genes from one fruit into the genome of another one. Most times this method doesn't work, but sometimes, in very rare cases, a…
一个清晰的思路就是状压dp:不过也有AC自动机+BFS的做法 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12),表示给定的字符串的个数. 以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50. Output 只有一行,为找到的最短的字符串T.在保证最短的前提下, 如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个. Sa…
最短母串 bzoj-1195 HNOI-2006 题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串. 注释:$1\le n\le 12$,$1\le max length \le 50$. 想法:刚开始在那里AC自动机半天,然后瞅了一眼数据范围... ...状压吧兄弟!! 首先,我们先做一些预处理:把可以被字符集中串包含的串都删掉:求出两个字符串连接后的长度(这个预处理暴力即可),设merge[i][j]表示串i和串j合并后的长度. 状态:dp[…
1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 894  Solved: 288[Submit][Status][Discuss] Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12),表示给定的字符串的个数.以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的…
P2322 [HNOI2006]最短母串问题 AC自动机+bfs 题目要求:在AC自动机建的Trie图上找到一条最短链,包含所有带结尾标记的点 因为n<12,所以我们可以用二进制保存状态:某个带结尾标记的点是否被处理到. 把编号为 i 的结尾标记设为2^(i-1) 然后跑一遍bfs,如果跑到某个点结尾标记之和=2^n-1,那么就说明答案找到了 开2个数组保存每个bfs状态的对应的上一个编号和对应字母 输出的时候递归即可 attention:保存bfs状态的数组一定要开的很大(2e5/1e6/2e…
[HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第一行是一个正整数n(n<=12),表示给定的字符串的个数. 以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50.   输出格式: 只有一行,为找到的最短的字符串T.在保证最短的前提下, 如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个.     考虑T匹配了所有的…
https://vjudge.net/problem/UVA-10453 给出一个字符串,问最少添加几个字符使其变为回文串,并输出任意一种答案.就是一个类似于LCS的题目,而且简化了一下,只会出现三种情况.令f[i][j]表示这个字符串i~j位的答案,当si==sj  f[i][j]=f[i+1][j-1] ;  否则f[i][j]=MIN{f[i+1][j],f[i][j-1]}+1,  取一个最小值就是答案,最后递归输出一下. #include<iostream> #include<…
2782: [HNOI2006]最短母串 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3  Solved: 2[Submit][Status][Web Board] Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12),表示给定的字符串的个数.以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度…
题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的个数. 以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50. 输出 只有一行,为找到的最短的字符串T.在保证最短的前提下, 如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个. 样例输入 2 ABCD BCDABC 样例输出 ABCDABC   题意是找一个最短的母串包含…
1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1346  Solved: 450[Submit][Status][Discuss] Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12),表示给定的字符串的个数.以下的n行,每行有一个全由大写字母组成的字符串.每个字符串…
题目大意:给定一个字符串集,求一个最短字串,使得该集合内的串都是该串的一个子串 算法:AC自动机+最短路+状压DP 注意空间限制 #include"cstdio" #include"cstring" #include"iostream" #include"algorithm" #include"bitset" #include"string" using namespace std; c…
1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MB Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12),表示给定的字符串的个数.以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50. Output 只有一行,为找到的最短的字符串T.在保证最短的前提下,如果有多个字…
#10061. 「一本通 2.4 练习 4」最短母串 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 1bentong 提交    提交记录    统计    讨论    测试数据   题目描述 原题来自:HNOI 2006 给定 n个字符串 S1,S2,⋯,Sn 要求找到一个最短的字符串 T,使得这 n 个字符串都是 T 的子串. 输入格式 第一行是一个正整数 n,表示给定的字符串的个数: 以下的 n 行,每行有一个全由大写字母组…
Color Length(UVA-1625)(DP LCS变形) 题目大意 输入两个长度分别为n,m(<5000)的颜色序列.要求按顺序合成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部. https://odzkskevi.qnssl.com/a68cbd3e27f46b4f02ea12b7b1a1abca 然后产生的新序列中,对于每一个颜色c,都有出现的位置,L(c)表示最小位置和最大位置之差,求L(c)总和最小的新序列. 分析 LCS 是公共上升子序列,在动态转移的过程中,考虑…
BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12),表示给定的字符串的个数. 以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50. Output 只有一行,为找到的最短的字符串T.在保证最短的前提下, 如果有多个字符串都满足要求,那么必须输出按字典序排列…
用递归来判断回文串 思路: ①首先如果是空串,一个字符,则判断是回文串 ②若不满足①,则我们需要对字符串进行递归判断,我们会想到要用第一个字符和最后一个字符进行比较,若相同则,第二个和倒数第二个进行比较,如此循环往复,就会出现一个终点 ③终点处会出现两种情况,第一种情况:两个不同位置的字符进行比较,第二种情况是:两个相同位置的字符进行比较.因此我们需要找出这个中间值,我们通过分奇偶的方式,算出最终左边要比较的数的下标,若为奇数,左边的下标为:len/2;若为偶数,左边的下标为:len/2: ④递…
Time Limit: 10 Sec  Memory Limit: 32 MB Submit: 1208  Solved: 402 [Submit][Status][Discuss] Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12),表示给定的字符串的个数.以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50. Output 只有…
迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11844   Accepted: 7094 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,…
package a.ab; import java.io.File; import java.io.IOException; public class AE { public static void main(String[] args) { File f=new File("D:\\DD"); new AE().fileList(f); } public void fileList(File fl){ try{ File[] fs=fl.listFiles(); for(File f…
来源:据说是某一年某个公司的面试题 题目:求1+2+…+n, 要求不能使用乘除法.for.while.if.else.s witch.case 等关键字以及条件判断语句(A?B:C) 分析:这题本来很简单,但是不能用循环和条件判断语句.但是理论上所有的递归都可以转化为循环,那是否可以用递归代替循环呢?照着这个思路走下去,貌似可以.可是用递归的话,递归怎么终止呢?这就得在return语句中做文章了.最让人奔溃的是不让用乘除法.但是乘法本质上是加法的累加. 思路: 把循环化为递归. 乘法改为递归实现…
import java.util.ArrayList; import java.util.Scanner; public class Text { @SuppressWarnings("resource") public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int M = scanner.nextInt();//M代表输入的M串字符串 int N=scanner.next…
UVA.10192 Vacation (DP LCS) 题意分析 某人要指定旅游路线,父母分别给出了一系列城市的旅游顺序,求满足父母建议的最大的城市数量是多少. 对于父母的建议分别作为2个子串,对其做LCS处理,最后的结果即为所求. 核心状态转移方程: if(c1[i] == c2[j]) dp[i][j] =dp[i-1][j-1]+1; else dp[i][j] = max(dp[i-1][j],dp[i][j-1]); 这里还有一个小技巧,当希望读取的字符数据,不是从字符数组的第0个元素…
UVA.10066 The Twin Towers (DP LCS) 题意分析 有2座塔,分别由不同长度的石块组成.现在要求移走一些石块,使得这2座塔的高度相同,求高度最大是多少. 问题的实质可以转化为LCS(最长公共子序列)问题. 推荐一篇写的比较好的博文: 动态规划求解最长公共子序列(LCS) 核心的状态转移方程: if(a[i] == b[j]) dp[i][j] = dp[i-1][j-1] +1; else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);…
LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以当成别的字符串的前缀使用. 实际情况可能更加复杂. 观察上面的两种情况 容易AC自动机可以解决类似的问题. 在AC自动机上跑 就可以借用别的字符串的后缀当做自己的前缀进行使用了. 考虑建立出AC自动机 我们要求出一条路径 使得AC自动机上所有的终止节点都被经过. 当然也有特殊情况 就是 以终止节点为…
day19 --------------------------------------------------------------- 实例027:递归输出 题目 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来. 分析:相反顺序可以用列表来,直接pop方法. 1 def reverseprint(a): 2 lit = list(a) 3 if len(lit)>0: 4 print(lit.pop()) 5 a = "".join(lit) 6 reverse…
题目 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入格式 第一行是一个正整数n(n<=12),表示给定的字符串的个数. 以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50. 输出格式 只有一行,为找到的最短的字符串T.在保证最短的前提下, 如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个. 输入样例 2 ABCD BCDABC 输出样例 ABCDABC 题解 写完状压dp后才知道…
按照子串出现的先后考虑.令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然.有点麻烦的是字典序,强行增加代码难度. 另一个比较简单的做法是上AC自动机,建出来后类似地令f[i][j]为已经出现的字符串集合为i,在自动机上点j时的最短串长,相当于跑一个最短路,bfs时每次优先选字典序最小的边即可. #include<iostream> #include<cstdio> #include<cmath>…
我有病吧--明明直接枚举是否匹配就可以非要写hash,然后果然冲突了(--我个非酋居然还敢用hash 设f[s][i]为已选串状态为s并且最后一个串是i,还有预处理出g[i][j]表示最长有长为g[i][j]的i串后缀等于j串前缀这里,直接暴力匹配即可-- 然后注意到比较麻烦的事要求字典序最小,但是因为空间限制我们又不能给每个f存一个串,所以我们设t[s][i][j]为状态使f[s][i]长度最小且字典序最小的选串顺序的第j个选的是那个串,这个更新f[s][i]的时候直接更新,注意如果有等于当前…
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求LCS,转移同时维护f[i][j].s为当前状态字典序最小最优解 f[n][n].s的前半部分一定是回文串的前半部分(想想就行了) 当s的长度为奇时要多输出一个(因为这样长度+1,并且字典序保证最小(如axyzb  bzyxa,就是axb|||不全是回文串的原因是后半部分的字典序回文串可能不是最小,多…
Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串.Input 第一行是一个正整数n(n<=12),表示给定的字符串的个数.以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50.Output 只有一行,为找到的最短的字符串T.在保证最短的前提下,如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个.Sample Input 2 ABCD BCDABCSample Outpu…