【发布时间】:2021-12-01 10:45:46
【问题描述】:
问题是找到一个 1
请帮我找到一个更聪明的算法来真正解决这个问题。为了更好地理解(C++),我实现了简单的方法:
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
vector<short> arr(n);
for (int i = 0; i < n; ++i)
{
cin >> arr[i];
}
vector<vector<unsigned short>> positions(10001, vector<unsigned short>(0));
for (int i = 0; i < n; ++i)
{
positions[arr[i]].push_back(i);
}
vector<unsigned short> out;
for (int i = 0; i <= 10000; ++i)
{
if (positions[i].size() % 2)
{
cout << "NO" << "\n";
return 0;
}
for (int j = 0; j < positions[i].size(); j += 2)
{
out.push_back(positions[i][j]);
}
}
sort(out.begin(), out.end());
cout << "YES" << "\n";
for (int i = 0; i < out.size(); ++i)
{
cout << arr[out[i]] << " ";
}
}
【问题讨论】:
-
我认为对于子序列如何交织没有额外的限制?
-
对如何进行交织没有任何限制,我只需对序列进行排序,看看它是否包含每个值的偶数。除此之外,还需要对每个子序列的形成方式进行一些限制。
-
@JerryCoffin 这是一个序列而不是排列。因此 a, b, b, a, c, c 无效,但 a, b, a, c, b, c 有效,因为您可以通过这种方式从左到右删除 a, b, c剩下的就是 a、b、c。
-
您提到您还想找到原始子序列。模棱两可的时候呢?例如
aabbaabb可以由aabb或abab组成。 -
@JerryCoffin 正如 maraca 已经说过的那样,不需要约束,因为我们无法更改子序列中术语的顺序
标签: c++ algorithm text lexical-analysis