#include <stdio.h>
#include <algorithm>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int max(int a, int b) {
return a < b ? b : a;
}
bool comp(const string &l, const string &r) {
for (int i = 0; i < max(l.length(), r.length()); i++) {
if (i >= l.length()) return false;
if (i >= r.length()) return true;
if (l[i] < r[i]) return l[i] < r[i];
}
return true;
}
int main(void) {
int N; scanf("%d", &N);
vector<string> v;
for (int i = 0; i < N; i++) {
string s; cin >> s;
v.push_back(s);
}
sort(v.begin(), v.end(), comp);
for (const string& s : v) {
cout << s;
}
cout << endl;
}
在昨天举行的第9轮教育代码指令中,我无法使用带有用户定义函数的排序来解决问题http://codeforces.com/contest/632/problem/C。
我使用了包含字符串的stl向量,它似乎适用于某些测试用例,但它在下面的测试用例中出现运行时错误。
100 abccaacaacacabbbcbbabcccccacabbaccbcacabcbbbaca bbbaccbbccbbbcacaabbcccaabcbbcbbbacaacabc cccabccaaabcaccabccbcccbbaacaaccbb cccabccaaabcaccabccbcccbbaacaaccbbcb cccabccaaabcaccabccbcccbbaacaaccbb cccabccaaabcaccabccbcccbbaacaaccbbbcca abbbcbbbbbbcccccbcbbb bbbaccbbccbbbcacaabbcccaabcbbcbbbacaacabcb abbcacbcabacccbcbabaabcaabcabacbbbbbca cccabccaaabcaccabccbcccbbaacaaccbbcaa cbcbbaccacbcababbccaacabacbcabbaccbcbcbcabbc acbbbbbbbcabbcbcaccccbcbaacccaccabcbaac bacccabacbbaaa
由于代码强制的策略,我无法查看完整的测试输入。我如何打败这种情况?
答案 0 :(得分:2)
您的comp()
谓词并未处理l[i] > r[i]
的情况。所以当比较&#34; foo&#34;时它返回1和&#34; boo&#34;,并在比较&#34; boo&#34;时返回1和&#34; foo&#34;。因此,它无法实现严格的弱排序(即,行为不像<=
),并且将其传递给std::sort()
的结果未定义。
答案 1 :(得分:1)
尝试使用标准比较方法(不是您自己的bool comp(const string &l, const string &r)
),例如:
#include <algorithm>
#include <string>
#include <vector>
#include <iostream>
#include <functional>
using namespace std;
int main(void) {
int N;
cin >> N;
vector<string> v;
for (int i = 0; i < N; i++) {
string s;
cin >> s;
v.push_back(s);
}
std::sort (v.begin(), v.end(), std::greater<string>());
// or std::less<string>()
for (const string& s : v) {
cout << s << endl;
}
cout << endl;
}
或者将您的功能更改为简单功能,例如:
bool comp(const string &l, const string &r) {
return l < r;
}
<强>更新强>
但是如果你真的想使用你自己的comp
函数,你应该理解异常invalid operator <
出现的原因,因为你的比较函数(comp
)返回true
时两个相关字段都相等(sort
所需的“小于”的行为不正确。)
最后,小提示(这不是一个解决方案) - 试试这个代码:
bool comp(const string &l, const string &r) {
for (int i = 0; i < max(l.length(), r.length()); i++) {
if (i >= l.length()) return false;
if (i >= r.length()) return true;
if (l[i] != r[i]) return l[i] < r[i];
}
return true;
}