题目链接
题意:就是给定n个长度为m的字符串,你可以任意选若干字符串,把他们随意排列能成为回文串,要你输出回文串的最大长度。
思路:这题一开始想着,构造不就好了嘛,可是后来卡住了一个问题,就是有多个本身就是回文串的情况改怎么办,后来才发现,我是个傻逼。。。题目明明说了所有字符串都是不同的。。。于是乎,本身就是回文串的话你随便放一个就好了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
typedef long long ll;
map<string,int>p;
string s[101],s2;
vector<string>ans,temp,ans1;
bool check(string s)
{
int left=0,right=s.size()-1;
while(left<=right)
{
if(s[left]!=s[right]) return false;
left++,right--;
}
return true;
}
string re(string s)//比赛时临时忘了字符串反转函数怎么写,就手动写了一个
{
string str;
for(int i=s.size()-1;i>=0;--i) str+=s[i];
return str;
}
int main()
{
int n,m,k=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
cin>>s2;
if(check(s2)) {
temp.push_back(s2);continue;}
s[k++]=s2;
p[s2]++;
}
for(int i=0;i<k;++i)
{
string s1=re(s[i]);
if(p[s1]>0) ans.push_back(s[i]),p[s1]--,p[s[i]]--;
}
// if(ans.size()==0&&temp.size()==0) {
// cout<<0<<endl;return 0;
// }
for(auto i:ans) ans1.push_back(i);
if(temp.size()>0) ans1.push_back(temp[0]);
for(int i=ans.size()-1;i>=0;--i) ans1.push_back(re(ans[i]));
cout<<ans1.size()*m<<endl;
for(auto i:ans1) cout<<i;
}