Cho hai xâu nhị phân S,T, ∣T∣≤∣S∣. Có thể đổi một số ký tự của T; hãy tìm số đổi nhỏ nhất để T trùng với một đoạn liên tiếp của S.
Input
Hai dòng lần lượt chứa hai xâu nhị phân S và T.
Output
In số ký tự ít nhất phải đổi.
Constraints
1≤∣T∣≤∣S∣≤106; hai xâu chỉ gồm 0 và 1.
Scoring
Subtask 1 (50 điểm): Kích thước dữ liệu và số lượng token đủ nhỏ để có thể kiểm tra trực tiếp.
Subtask 2 (50 điểm): Không có ràng buộc bổ sung.
Example
Test 1
Input
001111
11
Output
0
Giải thích: Ta so sánh T với từng đoạn cùng độ dài của S; số sai khác nhỏ nhất chính là kết quả.
Lời giải tóm tắt
Thuật toán: Mã hóa bit 1 của S thành A, bit 1 của bản đảo T thành B. Tích chập tại alignment l cho both, số vị trí mà hai xâu đều là 1. Prefix sum cho onesS trong đoạn, và tính trước onesT.
Thuật toán: Số khác nhau là onesS + onesT - 2*both, vì hai hạng đầu đếm mọi bit 1 và trừ hai lần các cặp 1-1. Lấy nhỏ nhất trên mọi alignment.
Chứng minh đúng: Xét một vị trí: cặp 00 đóng góp 0; 01 hoặc 10 đóng góp 1; 11 đóng góp 1+1-2=0. Vậy biểu thức đúng bằng Hamming distance. Convolution cung cấp đúng both cho tất cả alignment cùng lúc.
Độ phức tạp:O((|S|+|T|)log(|S|+|T|)) thời gian, O(|S|+|T|) bộ nhớ.