codeforce div2 620 B. Longest Palindrome

在这里插入图片描述
题意很好理解,就是有若干个长度已知各不相同的字符串,让我们组成一个尽可能长的回文串,刚开始我找错了方向,想着转换成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;}
发布了48 篇原创文章 · 获赞 17 · 访问量 4462

猜你喜欢

转载自blog.csdn.net/weixin_45757507/article/details/104341194