掉了80分简直自闭
一开始考虑用mutiset去模拟,然而一直有迭代器出错的问题,卡在同一个点。
赛后发现用vector或者map都能做,菜的一批
题意:求一个四元组,其中四元组1,2为一个组合,3,4为一个组合,1,3的元音数目一样,2,4不仅原因数目一样而且结尾的元音也是一样。
我们考虑大力贪心一波。因为可以发现,其实所有字符串都能抽象为元音个数+结尾的形式,而且所求组合和顺序无关,我们用map把长度为n,结尾为m的字符串,存在一起。
然后开始遍历,可以发现,如果长度一样的结尾为m的字符串是奇数个 ,那么两两凑对以后会单出来一个,我们家把他加入集合长度为n,但结尾随意的一个map中,表示这个map中的所有字符串能做1,3.
即先找出2,4,然后再来一遍,找出1,3,最后统计结果即可。
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<map>
//#include<regex>
#include<cstdio>
#define up(i,a,b) for(int i=a;i<b;i++)
#define dw(i,a,b) for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
int read()
{
char ch = getchar(); int x = 0, f = 1;
while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
typedef pair<int, int> pir;
map<pair<int, char>, vector<string > >mp;
map<int, vector<string > >mp2;
vector<pair<string ,string> >ans1;
vector<pair<string ,string> >ans2;
int n;
char vowel[6] = "aeiou";
string s;
int main()
{
n = read();
up(i, 0, n)
{
int cnt = 0;
char last;
cin >> s;
up(i, 0, s.size())
{
up(j, 0, 5)
{
if (s[i] == vowel[j])
{
cnt++; last = s[i];
}
}
}
mp[make_pair(cnt, last)].push_back(s);
}
for (auto k : mp)
{
auto vec = k.second;
for (int i = 0; i + 1 < vec.size(); i += 2)
{
ans1.push_back(make_pair(vec[i], vec[i + 1]));
}
if (vec.size() & 1)
{
mp2[k.first.first].push_back(vec.back());
}
}
for (auto k : mp2)
{
auto vec = k.second;
for (int i = 0; i + 1 < vec.size(); i += 2)
{
ans2.push_back(make_pair(vec[i], vec[i + 1]));
}
}
while (ans1.size() > ans2.size())
{
ans2.push_back(ans1.back());
ans1.pop_back();
}
int len = min(ans1.size(), ans2.size());
cout << len << endl;
up(i, 0, len)
{
cout << ans2[i].first<<" "<<ans1[i].first<<endl;
cout << ans2[i].second << " " << ans1[i].second << endl;
}
return 0;
}
本文探讨了一种解决特定字符串配对问题的算法,通过使用map数据结构将字符串按元音数量和结尾进行分类,实现了高效查找匹配四元组的目标。文章详细介绍了算法思路和实现过程,包括如何处理字符串特征,以及如何利用map存储和检索数据。
7495

被折叠的 条评论
为什么被折叠?



