Editorial for Bedao Grand Contest 12 - PALIN
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Ta dùng mảng tổng tiền tố để có thể tính số lượng chữ cái mỗi loại trong đoạn từ ~l~ đến ~r~. Gọi ~cnt_{i, c}~ là tổng số lượng chữ cái ~c~ trong đoạn từ ~1~ đến ~i~, số lượng chữ cái ~c~ trong đoạn từ ~l~ đến ~r~ bằng ~cnt_{r, c} - cnt_{l-1,c }~.
Nếu với mọi chữ cái ~c~ từ 'a' đến 'z' trong đoạn từ ~l~ đến ~r~ đều có số lượng chẵn, ta có thể tạo palindrome với độ dài tối đa bằng ~r-l+1~ bằng cách chia đôi số lượng chữ cái mỗi loại, tạo ra một xâu bất kì có độ dài ~\frac{r-l+1}{2}~ với những chữ cái đã cho và lấy đối xứng sang bên phải. Gọi ~cur_c~ là số lượng chữ cái loại ~c~, khi đó số lượng xâu có thể tạo ra bằng = ~\frac{((r - l + 1) / 2)!}{(cur_a/2)! \cdot (cur_b/2)! ... (cur_z/2)!}~. Để có thể tính phép tính này, ta cần dùng nghịch đảo modulo.
Nếu trong đoạn từ ~l~ đến ~r~ tồn tại chữ cái có số lượng lẻ, để xâu palindrome có độ dài tối đa, ta thấy rằng chỉ một kí tự được phép có số lượng lẻ, còn lại đều có số lượng chẵn. Dễ thấy kí tự có số lượng lẻ thì chắc chắn một kí tự loại này sẽ phải ở chính giữa xâu palindrome, khi đó số lượng cách sẽ được tính giống như số lượng cách của bài toán mọi kí tự đều có số lượng chẵn. Số lượng xâu tạo được = (số lượng kí tự có số lượng lẻ) ~\times~ (số lượng xâu tạo được nếu mọi kí tự đều có số lượng chẵn sau khi bớt các kí tự lẻ đi ~1~ kí tự).
Độ phức tạp: ~O((n+q)\cdot26)~.
Comments