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;
}