Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- using namespace std;
- typedef long long int ll;
- ll const Pr = 98765431;
- int main(){
- int n,m;
- scanf("%d %d",&n,&m);
- ll A[n];
- ll rA[n];
- for(int i = 0 ; i < n ; i ++){
- scanf("%lld",&rA[i]);
- A[i] = rA[i];
- }
- ll B[m];
- int oneindex[13];
- int oi = 0;
- for(int i = 0 ; i < m ; i ++){
- scanf("%lld",&B[i]);
- if(B[i] == 1){
- oneindex[oi++] = i;
- }
- }
- ll hB = 0;
- ll mem = 1;
- for(int i = 0 ; i < m ; i ++){
- hB *= Pr;
- hB += B[i];
- if(i!=0)mem*=Pr;
- }
- ll hA = 0;
- for(int i = 0 ; i < oi ; i ++){
- A[oneindex[i]] = 1;
- }
- //onemem gen
- int idx = oi - 1;
- ll onemem[13];
- ll tmem = 1;
- for(int i = m - 1 ; i >= 0 ; i --){
- if(i != m -1)tmem*=Pr;
- if(B[i] == 1){
- onemem[idx--] = tmem;
- }
- }
- int Alen = 0;
- int cted = 0;
- int ans = 0;
- for(int i = 0 ; i < n ; i ++){
- hA *= Pr;
- hA += A[i];
- Alen++;
- if(cted != 0){
- for(int j = 0 ; j < oi ; j ++){
- hA -= A[oneindex[j]+cted]*onemem[j];
- hA += 1*onemem[j];
- }
- }
- if(Alen == m){
- if(hA == hB){
- ans++;
- }
- //if(cted == 0){
- for(int j = 0 ; j < oi ; j ++){
- if(cted == 0)A[oneindex[j]] = rA[oneindex[j]];
- hA -= 1*onemem[j];
- hA += A[oneindex[j]+cted]*onemem[j];
- }
- //}
- hA -= A[i - m + 1]*mem;
- Alen--;
- cted++;
- }
- }
- printf("%d",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement