canuc80k0437·38/50

Trộn Hai Luồng Chữ Số

Nộp bài trên LQDOJ

Bài 04 · Greedy

Cho một xâu chỉ gồm các chữ số thập phân. Trong một thao tác, bạn được đổi chỗ hai chữ số kề nhau nếu một chữ số chẵn và chữ số kia lẻ.

Bạn có thể thực hiện thao tác bao nhiêu lần tùy ý. Hãy tìm xâu nhỏ nhất theo thứ tự từ điển có thể nhận được. Các số ở đầu xâu vẫn được giữ nguyên và tham gia so sánh như mọi chữ số khác.

Input

  • Dòng đầu chứa số nguyên - số bộ dữ liệu.
  • Mỗi bộ dữ liệu gồm một dòng chứa xâu chữ số .

Output

  • Với mỗi bộ dữ liệu, in ra xâu nhỏ nhất có thể nhận được.

Constraints

  • .
  • .
  • Mỗi ký tự của thuộc từ '0' đến '9'.
  • Tổng độ dài các xâu qua tất cả bộ dữ liệu không vượt quá .

Scoring

  • Subtask ( số điểm): Mỗi xâu có độ dài không vượt quá và tổng độ dài không vượt quá .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

3
7092
86420
135024

Output

0279
86420
012345

Giải thích: Với , thứ tự tương đối của và của phải được giữ, nhưng hai dãy có thể trộn thành ; xâu chỉ có chữ số chẵn nên không đổi được, còn cho phép trộn thành .

Lời giải tóm tắt
  • Ý tưởng: Hai chữ số cùng tính chẵn lẻ không bao giờ được đổi chỗ trực tiếp. Mọi thao tác chỉ cho một chữ số chẵn đi qua một chữ số lẻ, nên thứ tự tương đối của các chữ số chẵn được giữ nguyên; điều tương tự đúng với các chữ số lẻ.
  • Ý tưởng: Ngược lại, mọi cách trộn hai dãy con đó mà vẫn giữ thứ tự nội bộ đều thực hiện được bằng các phép đổi chỗ kề nhau khác tính chẵn lẻ. Vì vậy tập kết quả đúng là tập các phép trộn ổn định của:
  • Ý tưởng: dãy các chữ số chẵn theo thứ tự xuất hiện;
  • Ý tưởng: dãy các chữ số lẻ theo thứ tự xuất hiện.
  • Ý tưởng: Để lấy phép trộn nhỏ nhất từ điển, ở mỗi vị trí chọn chữ số nhỏ hơn ở đầu hai dãy. Nếu chọn chữ số lớn hơn trong khi chữ số nhỏ hơn đang sẵn sàng, vị trí đầu tiên khác nhau đã làm kết quả tệ hơn và các lựa chọn sau không thể sửa lại.
  • Ý tưởng: Thuật toán chạy trong O(|s|) thời gian và dùng O(|s|) bộ nhớ cho mỗi xâu.