Advertisement
SuitNdtie

Factor match KMP

May 11th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.23 KB | None | 0 0
  1. #include<stdio.h>
  2. typedef long long int ll;
  3. /*
  4. int factor(int x){
  5.     int cnt = 0;
  6.     int i;
  7.     for(i = 1 ; i * i <= x ; i ++){
  8.         if(x % i == 0){
  9.             cnt++;
  10.         }
  11.     }
  12.     i--;
  13.     cnt *= 2;
  14.     if(i*i == x){
  15.         cnt--;
  16.     }
  17.     return cnt;
  18. }*/
  19.  
  20. int factor[100010];
  21. int main()
  22. {
  23.     for(int i = 1 ; i <= 100000 ; i ++){
  24.         for(int j = i ; j <= 100000 ; j += i){
  25.             factor[j]++;
  26.         }
  27.     }
  28.     int n,m;
  29.     scanf("%d %d",&n,&m);
  30.     int arr[n];
  31.     int key[m];
  32.     for(int i = 0 ; i < n ; i ++){
  33.         int a;
  34.         scanf("%d",&a);
  35.         arr[i] = factor[a];
  36.     }
  37.     for(int i = 0 ; i < m ; i ++){
  38.         int k;
  39.         scanf("%d",&k);
  40.         key[i] = factor[k];
  41.     }
  42.    
  43.     int LPS[m];
  44.     LPS[0] = 0;
  45.     for(int i = 1 , j = 0 ; i < m ; ){
  46.         if(key[i] == key[j]){
  47.             LPS[i] = j + 1;
  48.             i ++; j ++;
  49.         }
  50.         else if(j > 0){
  51.             j = LPS[j-1];
  52.         }
  53.         else{
  54.             LPS[i] = 0;
  55.             i++;
  56.         }
  57.     }
  58. //  printf("Test LPS : ");for(int i = 0 ; i < m ; i ++)printf(" %d",LPS[i]);printf("\n");
  59.     int ans = 0;
  60.     for(int i = 0 , j = 0 ; i < n && i-j <= n-m  ; ){
  61.         if(arr[i] == key[j]){
  62.             i ++ ; j ++;
  63.             if(j > ans)ans = j;
  64.             if(j == m){
  65.             //  if(j > ans)ans = j;
  66.                 j = LPS[j-1];
  67.             }
  68.         }
  69.         else if(j > 0){
  70.             if(j > ans)ans = j;
  71.             j = LPS[j-1];
  72.         }
  73.         else{
  74.             i ++;
  75.         }
  76.     }
  77.     printf("%d",ans);
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement