题目链接

题目

题目描述

输入两个字符串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]\) 是否能组成回文子串。有转移方程:

\[dp[i][j][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 合并回文子串的更多相关文章

  1. 合并回文子串(区间dp)

    链接:https://ac.nowcoder.com/acm/problem/13230来源:牛客网 题目描述 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如" ...

  2. nowcoder 合并回文子串

    链接:https://www.nowcoder.com/acm/contest/6/C来源:牛客网题目输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc&q ...

  3. 美团2017年CodeM大赛-初赛A轮 C合并回文子串

    区间dp一直写的是递归版本的, 竟然超时了, 学了一下非递归的写法. #include <iostream> #include <sstream> #include <a ...

  4. Manacher's algorithm: 最长回文子串算法

    Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...

  5. 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297

    1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...

  6. [leetcode]5. Longest Palindromic Substring最长回文子串

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  7. LeetCode[5] 最长的回文子串

    题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  8. 最长回文子串-LeetCode 5 Longest Palindromic Substring

    题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  9. 最长回文子串(Longest Palindromic Substring)

    这算是一道经典的题目了,最长回文子串问题是在一个字符串中求得满足回文子串条件的最长的那一个.常见的解题方法有三种: (1)暴力枚举法,以每个元素为中心同时向左和向右出发,复杂度O(n^2): (2)动 ...

  10. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

随机推荐

  1. Java21 + SpringBoot3集成easy-captcha实现验证码显示和登录校验

    目录 前言 相关技术简介 easy-captcha 实现步骤 引入maven依赖 定义实体类 定义登录服务类 定义登录控制器 前端登录页面实现 测试和验证 总结 附录 使用Session缓存验证码 前 ...

  2. Linux-文件权限-rwx-chmod

  3. Go-数组-实现队列

    package main import ( "errors" "fmt" ) // 队列 // 特征: // 1. 按照元素的添加顺序排序,并且容量固定 // ...

  4. [转帖]ORACLE新参数MAX_IDLE_TIME和MAX_IDLE_BLOCKING_TIME简介

    https://www.cnblogs.com/kerrycode/p/16856171.html Oracle 12.2 引入了新参数MAX_IDLE_TIME.它可以指定会话空闲的最大分钟数.如果 ...

  5. [转帖]shell 把以空格分隔的变量 分割后的每个字段赋值给变量

    比如我有一个变量 "123 456 789",要求以空格为分隔符把这个变量分隔,并把分隔后的字段分别赋值给变量,即a=123:b=456:c=789 共有3中方法: 法一:先定义一 ...

  6. [转帖]s3fs - 使用S3FS存储桶目录允许其他用户使用权限

    https://www.coder.work/article/6661505   我在使用S3FS时遇到问题.我正在使用 ubuntu@ip-x-x-x-x:~$ /usr/bin/s3fs --ve ...

  7. [转帖]python读取配置文件获取所有键值对_python总结——处理配置文件(ConfigParser)

    python处理ConfigParser 使用ConfigParser模块读写ini文件 (转载) ConfigParserPython 的ConfigParser Module中定义了3个类对INI ...

  8. ELK运维文档

    Logstash 目录 Logstash Monitoring API Node Info API Plugins Info API Node Stats API Hot Threads API lo ...

  9. 兼容微信支付宝抖音小程序的工具推荐!还能将小程序搬到自己的app里面

    事情的起因是这样的. 之前在微信.支付宝和抖音开放平台都上架了自己的小程序,虽然几个平台有自己的开发标准,但是都是基于 JavaScript 这种已经被广泛使用的编程语言进行开发的,对于开发者而言学习 ...

  10. vue中v-show你不知道的用法 created computed mounted的执行顺序

    我们都知道,v-show的值是一个布尔类型的. 我通过这个值进行显示或者隐藏. 但是有些时候,这个值是true还是false,我们需要去进行计算 此时我们就可以使用v-show="XXX() ...