Link It's a simple problem with a simple solution, But still I'm not able to figure out why is there runtime error on a couple of test cases.
Program
# | User | Rating |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3814 |
3 | jqdai0815 | 3682 |
4 | Benq | 3529 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3517 |
7 | Radewoosh | 3410 |
8 | hos.lyric | 3399 |
9 | ecnerwala | 3392 |
9 | Um_nik | 3392 |
# | User | Contrib. |
---|---|---|
1 | cry | 169 |
2 | maomao90 | 162 |
2 | Um_nik | 162 |
4 | atcoder_official | 161 |
5 | djm03178 | 158 |
6 | -is-this-fft- | 157 |
7 | adamant | 155 |
8 | awoo | 154 |
8 | Dominater069 | 154 |
10 | luogu_official | 150 |
Link It's a simple problem with a simple solution, But still I'm not able to figure out why is there runtime error on a couple of test cases.
string s;
map<char, int> pos;
bool comp(string s1, string s2) {
int len = min(s1.size(), s2.size());
for (int i = 0; i < len; ++i) {
if (pos[s1[i]] < pos[s2[i]]) return true;
else if (pos[s1[i]] > pos[s2[i]]) return false;
}
if (s1.size() == s2.size()) return true;
else {
if (len == s1.size()) return true;
else return false;
}
}
void solve()
{
cin >> s;
for (int i = 0; i < 26; ++i) {
pos[s[i]] = i;
pos['A' + s[i] - 'a'] = i + 26;
}
int n; cin >> n;
vector<string> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
sort(a.begin(), a.end(), comp);
for (int i = 0; i < n; ++i) cout << a[i] << endl;
cout << endl;
}
Name |
---|
You should change the line
if (s1.size() == s2.size()) return true;
toif (s1.size() == s2.size()) return false;
Check out https://codeforces.net/blog/entry/57036?#comment-406911 for the reason.
Here and on a more practical note here. The second one is more useful, and it describes all of the conditions you need for a valid sorting order in C++. Comparators use a strict-weak ordering, which means that they should satisfy irreflexivity, transitivity, and transitivity of equivalence. Your comparator doesn't satisfy irreflexivity, so it sometimes throws a runtime error.