NC13230 合并回文子串
题目
题目描述
输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。
我们定义字符串的价值为其最长回文子串的长度(回文串表示从正反两边看完全一致的字符串,如"aba"和"xyyx")。
需要求出所有可能的C中价值最大的字符串,输出这个最大价值即可
输入描述
第一行一个整数T(T ≤ 50)。
接下来2T行,每两行两个字符串分别代表A,B(|A|,|B| ≤ 50),A,B的字符集为全体小写字母。
输出描述
对于每组数据输出一行一个整数表示价值最大的C的价值。
示例1
输入
2
aa
bb
a
aaaabcaa
输出
4
5
题解
知识点:区间dp。
一个字符串的最长回文子串需要一个区间dp即可,而且因为是串,那形成的回文串一定是整个区间,因此比起子序列记录长度,子串只需要记录区间可不可行即可。这道题是两个字符串,考虑二重区间dp。
设 \(dp[i][j][u][v]\) 表示为\(s_1\) 的区间 \([i,j]\) 和 \(s_2\) 的区间 \([u,v]\) 是否能组成回文子串。有转移方程:
\left \{
\begin{array}{l}
dp[i+1][j-1][u][v] &,l_1 \geq 2 且 s_1[i] = s_1[j]\\
dp[i+1][j][u][v-1] &,l_1 \geq 1 且 l_2 \geq 1且s_1[i] = s_2[v]\\
dp[i][j-1][u+1][v] &,l_1 \geq 1 且 l_2 \geq 1且s_2[u] = s_1[j]\\
dp[i][j][u+1][v-1] &,l_2 \geq 1 且 s_2[u] = s_2[v]\\
\end{array}
\right.
\]
因为合并子序列后相对位置不变,端点一定还是端点,枚举可能出现的新端点即可,左右端点 \([left,right]\) 分别可以出现在 \([s_1,s_1],[s_1,s_2],[s_2,s_1],[s_2,s_2]\) 。
时间复杂度 \(O(n^2m^2)\)
空间复杂度 \(O(n^2m^2)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool dp[52][52][52][52];
char s1[52], s2[52];
bool solve() {
memset(dp, 0, sizeof(dp));
cin >> s1 + 1 >> s2 + 1;
int n = strlen(s1 + 1);
int m = strlen(s2 + 1);
int ans = 0;
for (int l1 = 0;l1 <= n;l1++) {
for (int l2 = 0;l2 <= m;l2++) {
for (int i = 1, j = l1;j <= n;i++, j++) {
for (int u = 1, v = l2;v <= m;u++, v++) {
if (l1 + l2 <= 1) dp[i][j][u][v] = 1;///(0,0),(0,1),(1,0)的情况都是回文,
else {
if (l1 >= 2 && s1[i] == s1[j]) dp[i][j][u][v] |= dp[i + 1][j - 1][u][v];
if (l1 >= 1 && l2 >= 1 && s1[i] == s2[v]) dp[i][j][u][v] |= dp[i + 1][j][u][v - 1];
if (l1 >= 1 && l2 >= 1 && s2[u] == s1[j]) dp[i][j][u][v] |= dp[i][j - 1][u + 1][v];
if (l2 >= 2 && s2[u] == s2[v]) dp[i][j][u][v] |= dp[i][j][u + 1][v - 1];
}
if (dp[i][j][u][v]) ans = max(ans, l1 + l2);
}
}
}
}
cout << ans << '\n';
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}
NC13230 合并回文子串的更多相关文章
- 合并回文子串(区间dp)
链接:https://ac.nowcoder.com/acm/problem/13230来源:牛客网 题目描述 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如" ...
- nowcoder 合并回文子串
链接:https://www.nowcoder.com/acm/contest/6/C来源:牛客网题目输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc&q ...
- 美团2017年CodeM大赛-初赛A轮 C合并回文子串
区间dp一直写的是递归版本的, 竟然超时了, 学了一下非递归的写法. #include <iostream> #include <sstream> #include <a ...
- Manacher's algorithm: 最长回文子串算法
Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...
- 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297
1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...
- [leetcode]5. Longest Palindromic Substring最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- LeetCode[5] 最长的回文子串
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 最长回文子串-LeetCode 5 Longest Palindromic Substring
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 最长回文子串(Longest Palindromic Substring)
这算是一道经典的题目了,最长回文子串问题是在一个字符串中求得满足回文子串条件的最长的那一个.常见的解题方法有三种: (1)暴力枚举法,以每个元素为中心同时向左和向右出发,复杂度O(n^2): (2)动 ...
- lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
随机推荐
- 2023第十四届极客大挑战 — CRYPTO(WP全)
浅谈: 本次大挑战我们队伍也是取得了第一名的成绩,首先要感谢同伴的陪伴和帮助.在共同的努力下终不负期望! 但遗憾的是我们没有在某个方向全通关的,呜呜呜~ 继续努力吧!要学的还很多.明年有机会再战!!加 ...
- [转帖]MYSQL--表分区、查看分区
https://www.cnblogs.com/pejsidney/p/10074980.html 一. mysql分区简介 数据库分区 数据库分区是一种物理数据库设计技术.虽然分区技术可 ...
- [转帖]新版 Elasticsearch 中的强悍插件 X-pack
https://zhuanlan.zhihu.com/p/36337697 3 人赞同了该文章 作者:Alan 岂安科技运维工程师努力踏上一条为后人留坑的运维之路.(逃 1 前言 Elk 日志可视 ...
- [转帖]《Linux性能优化实战》笔记(24)—— 动态追踪 DTrace
使用 perf 对系统内核线程进行分析时,内核线程依然还在正常运行中,所以这种方法也被称为动态追踪技术.动态追踪技术通过探针机制来采集内核或者应用程序的运行信息,从而可以不用修改内核和应用程序的代码就 ...
- [转帖]神秘的backlog参数与TCP连接队列
https://www.cnblogs.com/codelogs/p/16060820.html 简介# 这要从一次压测项目说起,那是我们公司的系统与另几家同行公司的系统做性能比拼,性能数据会直接影响 ...
- [转帖]dd命令中dsync和fsync区别
在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及几个常用参数:sync.dsync.fsync与fdatasync # dd if=/dev/zero of=/tmp/1G bs= ...
- 【图】苹果Safari 6.0停止支持Windows PC (转载)
[图]果Safari 6.0停止支持Windows PC (转载) http://bbs.tianya.cn/post-414-41510-1.shtml 2012年之后 苹果就不在开发 window ...
- java浅拷贝BeanUtils.copyProperties引发的RPC异常 | 京东物流技术团队
背景 近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到 人在地铁上,bug从咚咚来~ 没有任何修改的服务接口,抛出异常: ...
- JS中every的简单使用
every 方法 every()方法用于检测数组中的所有元素是否都满足指定条件. every()方法会遍历数组的每一项,如果有一项不满足条件,则返回false,剩余的项将不会再执行检测. 如果遍历完数 ...
- HTML直接插入js、css
简单的小页面可以使用 代码量大的话还是建议引用代码 直接包裹起来 <style>这里添加css代码</style> 加入css标识 <style type="t ...