Codeforces Round #620 (Div. 2)B. Longest Palindrome

B. Longest Palindrome

题目链接-B. Longest Palindrome
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题目大意
给n个长度为m的字符串,你可以任意拼接字符串,也可以舍弃一些字符串,拼接成最长的回文串,输出长度和这个回文串

解题思路
因为n,m都不大,所以可暴力,两重循环枚举即可,互为回文的字符串放在构造的回文串的两边,本身就是回文的放在构造的字符串的中间,如果满足条件记得用vis[]数组标记一下,以免重复

附上代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=1e9+7;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long ll;
typedef pair<int,int> PII;
string a[110],b[110];
string x,y,z;
bool vis[110];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>a[i];
		b[i]=a[i];
		reverse(b[i].begin(),b[i].end());//反转字符串b[i]
	}
	x="";y="";z="";
	ll ans=0;//用来计可用的字符串数目
	bool flag=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(b[i]==a[j]&&i!=j&&!vis[i]&&!vis[j]){
				ans+=2;
				x+=a[i];
				z=a[j]+z;//分别放在字符串前面和后面
				vis[i]=1;
				vis[j]=1;
				break;
			}
		}
		if(a[i]==b[i]&&!vis[i]&&!flag){
				ans++;
				y+=a[i];
				flag=1;
		}
	}
	cout<<ans*m<<endl;
	cout<<x+y+z<<endl;//最后拼接起来
	return 0;
}

发布了78 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104351757