Xét các dãy ngoặc đúng độ dài N dùng một loại ngoặc. Độ sâu của một dãy là số ngoặc mở chưa được đóng lớn nhất khi quét từ trái sang phải. Giữ các dãy có độ sâu đúng bằng k, sắp chúng theo thứ tự từ điển với ( đứng trước ), rồi hãy đếm số dãy và tìm thứ hạng 1-based của dãy truy vấn.
Input
Dòng đầu chứa N và k.
Dòng thứ hai chứa một dãy ngoặc đúng độ dài N, có độ sâu lớn nhất đúng bằng k.
Output
Dòng đầu in số dãy ngoặc đúng có độ sâu lớn nhất đúng bằng k.
Dòng thứ hai in thứ hạng 1-based của dãy đã cho.
Constraints
N chẵn, 2≤N≤60.
1≤k≤N/2.
Dãy truy vấn đúng và có độ sâu lớn nhất đúng bằng k.
Scoring
Subtask 1 (50% số điểm): N≤30.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
6 2
(()())
Output
3
1
Giải thích: Có ba dãy ngoặc đúng độ dài sáu có độ sâu lớn nhất đúng bằng hai; (()()) là dãy đầu tiên.
Lời giải tóm tắt
Phân tích: Dùng dp[pos][balance][hit]: số cách điền đoạn từ pos đến N−1 sao cho kết thúc balance 0, không bao giờ âm hoặc vượt k; hit cho biết tiền tố trước pos đã từng đạt balance k.
Phân tích: Cơ sở ở pos=N: chỉ trạng thái balance=0 và hit=1 có một cách. Chuyển:
Phân tích: đặt ( nếu balance<k, sang balance+1 và cập nhật hit;
Phân tích: đặt ) nếu balance>0, sang balance-1.
Phân tích: Tổng số dãy là dp[0][0][0].
Phân tích: Để tính rank, bắt đầu 1 và đi theo chuỗi S. Mỗi khi ký tự thật là ), lựa chọn nhỏ hơn ( đứng trước; nếu hợp lệ, cộng số hậu tố từ trạng thái sau khi mở ngoặc. Sau đó cập nhật trạng thái theo ký tự thật.
Tính đúng đắn: Recurrence DP phân hoạch mọi dãy hoàn tất theo ký tự kế tiếp và duy trì đầy đủ ba điều kiện: không âm, không vượt k, cuối về 0 và từng đạt k. Vì vậy DP đếm đúng tập S.
Tính đúng đắn: Với rank, hai dãy khác nhau được quyết định ở vị trí khác đầu tiên; chỉ có khả năng một dãy dùng ( còn S dùng ). Tất cả hậu tố hợp lệ của lựa chọn ( tạo một block đứng trước và được DP đếm chính xác. Các block cộng ở các vị trí khác đầu tiên là rời nhau, nên rank thu được đúng.