#PH015. Tạo các chuỗi (Creating Strings)

Tạo các chuỗi (Creating Strings)

Tạo các chuỗi

Nguồn: CSES Problem Set

Phiên bản: Phước Hưng OJ Extended

Đề bài

Cho một chuỗi ss gồm nn ký tự chữ cái thường tiếng Anh.

Hãy tạo ra tất cả các chuỗi phân biệt có thể thu được bằng cách sắp xếp lại toàn bộ các ký tự của ss.

Mỗi ký tự của chuỗi ban đầu phải được sử dụng đúng số lần nó xuất hiện trong ss. Nếu một ký tự xuất hiện nhiều lần thì việc hoán đổi vị trí giữa các lần xuất hiện giống nhau không tạo thành một chuỗi mới.

Gọi kk là số chuỗi phân biệt có thể tạo được.

Các chuỗi kết quả phải được in theo thứ tự từ điển tăng dần.

Input

Dòng duy nhất chứa chuỗi ss gồm nn ký tự.

Mỗi ký tự của ss thuộc khoảng từ a đến z.

Output

Dòng đầu tiên in số nguyên kk — số chuỗi phân biệt có thể tạo được từ các ký tự của ss.

Tiếp theo in kk dòng, mỗi dòng chứa một chuỗi kết quả.

Các chuỗi phải được in theo thứ tự từ điển tăng dần.

Subtask

  • Subtask 1 — 10%: 1≤n≤61 \le n \le 6.
  • Subtask 2 — 20%: 1≤n≤91 \le n \le 9.
  • Subtask 3 — 30%: 1≤n≤141 \le n \le 14; nếu 10≤n≤1410 \le n \le 14 thì tồn tại một ký tự xuất hiện ít nhất n−4n-4 lần.
  • Subtask 4 — 40%: 1≤n≤20001 \le n \le 2000; nếu 10≤n≤1410 \le n \le 14 thì tồn tại một ký tự xuất hiện ít nhất n−4n-4 lần; nếu 15≤n≤200015 \le n \le 2000 thì tồn tại một ký tự xuất hiện ít nhất n−1n-1 lần.

Ví dụ

Input

aabac

Output

20
aaabc
aaacb
aabac
aabca
aacab
aacba
abaac
abaca
abcaa
acaab
acaba
acbaa
baaac
baaca
bacaa
bcaaa
caaab
caaba
cabaa
cbaaa

Giải thích

Chuỗi aabac có 55 ký tự, trong đó ký tự a xuất hiện 33 lần, còn b và c mỗi ký tự xuất hiện một lần.

Nếu phân biệt cả ba ký tự a thì có 5!5! cách sắp xếp. Tuy nhiên ba ký tự a giống nhau nên mỗi chuỗi thực tế bị tính lặp 3!3! lần. Vì vậy số chuỗi phân biệt là

k=5!3!=20.k=\frac{5!}{3!}=20.

Output chứa đúng 2020 chuỗi phân biệt và được sắp xếp theo thứ tự từ điển tăng dần, bắt đầu từ aaabc và kết thúc bằng cbaaa.