列表

详情


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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 3791ms, 内存消耗: 226608K, 提交时间: 2021-05-22 22:46:22

T = int(input())
for _ in range(T):
	a, b = input().strip(), input().strip()
	n, m, ans = len(a), len(b), [0]
	dp = [[False] * (m + 1) * (m + 1) for _ in range((n + 1) * (n + 1))]

	def solve(i, j, k, l):
		if dp[i * (n + 1) + j][k * (m + 1) + l]: return
		ans[0] = max(ans[0], j - i + l - k)
		dp[i * (n + 1) + j][k * (m + 1) + l] = True
		if j + 1 <= n:
			if i > 0 and a[i - 1] == a[j]: solve(i - 1, j + 1, k, l)
			if k > 0 and b[k - 1] == a[j]: solve(i, j + 1, k - 1, l)
		if l + 1 <= m:
			if k > 0 and b[k - 1] == b[l]: solve(i, j, k - 1, l + 1)
			if i > 0 and a[i - 1] == b[l]: solve(i - 1, j, k, l + 1)

	for j in range(n + 1):
		for l in range(m + 1):
			for i in range(j + 1):
				for k in range(l + 1):
					if j - i + l - k <= 1:
						solve(i, j, k, l)
	print(ans[0])

C++(g++ 7.5.0) 解法, 执行用时: 484ms, 内存消耗: 8136K, 提交时间: 2022-10-05 20:38:25

#include<bits/stdc++.h>
using namespace std;
char a[55],b[55];
bool f[53][53][53][53];
int main(){
	int T;
	cin>>T;
	while(T--){
		cin>>a+1>>b+1;
		memset(f,0,sizeof f);
		int la=strlen(a+1),lb=strlen(b+1),ans=1;
		for(int i=la+1;i>0;--i)
			for(int k=lb+1;k>0;--k)
				for(int j=i-1;j<=la;++j)
					for(int l=k-1;l<=lb;++l){
						int len_a=j-i+1,len_b=l-k+1;
						if(len_a+len_b<=1){
							f[i][j][k][l]=1;
							continue;
						}
						if(len_a>1&&a[i]==a[j])
							f[i][j][k][l]|=f[i+1][j-1][k][l];
						if(len_b>1&&b[k]==b[l])
							f[i][j][k][l]|=f[i][j][k+1][l-1];
						f[i][j][k][l]|=f[i][j-1][k+1][l]&(a[j]==b[k]);
						f[i][j][k][l]|=f[i+1][j][k][l-1]&(a[i]==b[l]);
						if(f[i][j][k][l])
							ans=max(ans,len_a+len_b);
					}
		cout<<ans<<endl;
	}
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 677ms, 内存消耗: 4636K, 提交时间: 2022-07-30 11:53:33

#include<bits/stdc++.h>
using namespace std;
const int N=55;
bool dp[N][N][N][N];
int main (void)
{
	int t;
	cin>>t;
	while(t--)
	{
		string a,b;
		cin>>a>>b;
		int ans=0;
		for(int l1=0;l1<=a.size();l1++)
		for(int l2=0;l2<=b.size();l2++)
		for(int i=1;i+l1-1<=a.size();i++)
		for(int j=1;j+l2-1<=b.size();j++)
		{
			bool f=0;
			if(l1+l2<=1) f=1;
			if(i+l1-2>=0&&a[i-1]==a[i+l1-2]&&dp[i+1][i+l1-2][j][j+l2-1]) f=1;
			if(j+l2-2>=0&&b[j-1]==b[j+l2-2]&&dp[i][i+l1-1][j+1][j+l2-2]) f=1;
			if(j+l2-2>=0&&a[i-1]==b[j+l2-2]&&dp[i+1][i+l1-1][j][j+l2-2]) f=1;
			if(i+l2-2>=0&&b[j-1]==a[i+l1-2]&&dp[i][i+l1-2][j+1][j+l2-1]) f=1;
			dp[i][i+l1-1][j][j+l2-1]=f;
			if(f) ans=max(ans,l1+l2);
		}
		cout<<ans<<endl;
	}
}

上一题