题意很好理解,就是有若干个长度已知各不相同的字符串,让我们组成一个尽可能长的回文串,刚开始我找错了方向,想着转换成26进制在暴力找解的方法,后发现不太可行,看到标称里那么多stl,直接用一些c++内置功能完成了题目的求解,首先是set去复制一份字符串的值,直接用其内置的find函数确实是否有合适的值,在这里有一个点很有意思,find函数在找不到这个的位置时,会自动返回end所以判断是否存在回文可以用.find!=.end。这是个很有趣的应用,查了很久才了解到这个用法,其次既然不常用set,在这里我也简单介绍一些第一次用到的set功能earse可以删去这个元素的迭代器,set容器还提供自动排序和去重的功能,可以存储多种类型的数据,之后因为这道题所有字符串均不同,所以我们需要考虑自身是回文串的串,随便选一组放在中间。使用vactor去存前半部分和后半部分,使用c++内置的reverse来翻转字符串。最后在介绍一个c++的语法for(x:y)的意义是遍历所有y中的x;
题解写到这里,也算发现这道题其实大部分内容都是靠c++内置功能实现的,所以我们要更熟练的使用这些数据结构
下面代码
#include<bits/stdc++.h>
using namespace std;
string s[100];
int mian()
{
set<string> awsd;
int n, m, i;
cin >> n >> m;
for (i = 0; i < n; i++)
{
cin >> s[i];
awsd.insert(s[i]);
}
vactor<string>left,right;
string mid,dmid;
for(int i=1;i<=n;i++)
{
dmid=s[i];
reverse(dmid.begin(),dmid.end());
if(s[i]=dmid)
mid=dmid;
else if(awsd.find(dmid)!=awsd.end())
{
left.push_back(s[i]);
right.push_back(dmid);
awsd.earse(s[i);
awsd.earse(dmid);
}
}
cout<<left.size()* m * 2 + mid.size() << endl;
for (string x : left)
cout << x;
cout << mid;
reverse(right.begin(), right.end());
for (string x : right)
cout << x;
cout << endl;
}
return 0;}
来源:CSDN
作者:徒手装机甲
链接:https://blog.csdn.net/weixin_45757507/article/details/104341194