Cho em hỏi ạ, bài này em sai chỗ nào: http://ntucoder.net/Problem/Details/4496
Trong hồi kí của một người ở Bắc Mĩ có viết về sự phân biêt về giai cấp, như cha ông ấy là “middle-middle-middle-lower-middle class” và mẹ ông ấy “upper-upper-lower-middle class”. Ngoài ra trong cuốn hồi kí còn có ghi tên và giai cấp của một số người trong gia đình, để giúp người đọc dễ tìm hiểu về sự phân biêt về giai cấp trong cuốn hồi kí bạn có nhiệm vụ sắp xếp tên của những nguời đó theo thứ tự theo hệ thống phân bậc từ cao đến thấp.
Input
Dòng đầu tiên là số nguyên dương T (T<=500) là số trường hợp. Mỗi trường hợp, bắt đầu là số nguyên dương n (n<=100) theo sau đó là danh sách n người. Mỗi dòng bắt đầu là tên với không quá 30 kí tự thường và kết thúc bởi dấu “:”, tiếp theo đó là chuỗi khác rỗng mô tả giai cấp gồm không quá 10 từ (upper, middle, lower) cách nhau bởi dấu “-” kết thúc là “class”. Không có hai người bất kì cùng tên trong mỗi truờng hợp.
Output
Với mỗi trường hợp in ra danh sách tên đã được sắp xếp theo hệ thống phân chia giai cấp từ cao xuống thấp. Nếu hai người có tầng lớp tương đương nhau thì sắp xếp theo bảng chữ cái abc. Kết thúc mỗi trường hợp là 30 dấu “=”.
Ví dụ
input
1
5
mom: upper-upper-lower-middle class
dad: middle-middle-middle-lower-middle class
queenelizabeth: upper-upper-upper class
chair: lower-lower class
unclebob: middle-middle-lower-middle class
output
queenelizabeth
mom
dad
unclebob
chair
==============================
Hướng dẫn
Có ba tầng lớp chính là : upper, middle, lower. Tất nhiên cao nhất là upper và thấp nhất là lower. Nhưng upper-upper class thì cao hơn middle-upper class và lower-upper class; middle-upper class thì cao hơn lower-upper class. Tuy nhiên tất cả tầng lớp như (upper-upper, middle-upper, lower-upper) thì cao hơn bất kì middle class (upper-middle, middle-middle, lower-middle) nào. Khi so sánh ta bắt đầu từ cuối lên đầu , ngoài ra middle-upper class thì tương đương middle-middle-upper class, middle-middle-middle-middle-lower class tương đương middle-lower class và cứ như vậy. Tuy nhiên upper-middle-middle-lower class thì cao hơn middle-lower class
Mới test 2 thôi mà nó đã trăm Test rồi, chả bt em sai chỗ nào
#include <bits/stdc++.h>
#define fi(i, a, b) for(int i = a; i <= b; i++)
#define fid(i, a, b) for(int i = a; i >= b; i--)
#define ll long long
#define maxn 105
using namespace std;
int t, n;
string classy, st;
bool cmp(pair<string, string> u, pair<string, string> v){
for (int i = 0, j = 0; i < u.first.length() || j < v.first.length(); i += (i < u.first.length()), j += (j < v.first.length())){
if (u.first[i] != v.first[j]) return u.first[i] > v.first[j];
}
fi(i, 0, min(u.second.length(), v.second.length()) - 1){
if (u.second[i] != v.second[i]) return u.second[i] < v.second[i];
}
return u.second.length() < v.second.length();
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL); cout.tie(NULL);
cin >> t;
fi(i, 1, t){
cin >> n;
pair<string, string> a[n+5];
fi(j, 1, n){
getline(cin, a[j].second, ':');
cin >> st >> classy;
istringstream ss(st);
string token[15];
int m = 1;
while(getline(ss, token[m], '-')) {
m++;
}
m--;
fid(k, m, 1){
if (token[k] == "lower") a[j].first += '1';
else if (token[k] == "middle") a[j].first += '2';
else if (token[k] == "upper") a[j].first += '3';
}
}
sort(a+1, a+n+1, cmp);
fi(j, 1, n) cout << a[j].second;
cout << "\n==============================";
}
}