Cho hai dãy số nguyên a gồm n phần tử và b gồm m phần tử.
Một đoạn liên tiếp al,al+1,…,al+m−1 được gọi là khớp với b nếu tồn tại một số nguyên x sao cho
al+i=bi+x
với mọi i từ 0 đến m−1. Số x được phép âm, bằng 0 hoặc dương, và có thể khác nhau giữa các đoạn.
Hãy đếm số vị trí bắt đầu l tạo thành một đoạn khớp. Nếu m>n thì không có vị trí nào hợp lệ. Đặc biệt, khi m=1, mọi phần tử của a đều tạo thành một đoạn khớp.
Input
Dòng đầu chứa hai số nguyên n và m.
Dòng thứ hai chứa n số nguyên a0,a1,…,an−1.
Dòng thứ ba chứa m số nguyên b0,b1,…,bm−1.
Output
In một số nguyên: số đoạn liên tiếp của a khớp với b.
Constraints
1≤n,m≤2⋅105.
1≤ai,bi≤109.
Scoring
Subtask 1 (50% số điểm): n,m≤300.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
8 3
5 7 8 2 4 5 10 12
1 3 4
Output
2
Giải thích: Đoạn bắt đầu tại 0 là (5,7,8), thu được khi cộng 4 vào mọi phần tử của b. Đoạn bắt đầu tại 3 là (2,4,5), tương ứng với độ dịch 1; không có vị trí bắt đầu nào khác thỏa mãn.
Lời giải tóm tắt
Ý tưởng: Nếu cộng cùng một số vào toàn bộ dãy b, mọi hiệu giữa hai phần tử liên tiếp của b đều giữ nguyên. Vì vậy một đoạn độ dài m của a khớp khi và chỉ khi dãy m-1 hiệu liên tiếp của đoạn đó bằng dãy hiệu của b.
Ý tưởng: Ta tạo da[i] = a[i+1]-a[i] và db[i] = b[i+1]-b[i], xây double rolling hash cho hai dãy hiệu rồi so hash của mọi cửa sổ dài m-1 trong da với hash của db. Trường hợp m=1 được xử lý riêng vì không có hiệu nào cần so; nếu m>n thì đáp án bằng 0.
Ý tưởng: Hai chiều của mệnh đề tương đương đều đúng: phép dịch không đổi hiệu; ngược lại, nếu mọi hiệu bằng nhau thì chọn x=a[l]-b[0] và suy ra lần lượt mọi phần tử còn lại cũng bằng nhau sau dịch.
Ý tưởng: Độ phức tạp: O(n+m) thời gian và O(n+m) bộ nhớ.