Advertisement
nullzero

Genome Evolution

Aug 17th, 2012
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. const int N(3001);
  10.  
  11. int A[N], B[N], hash[N], hash2[N];
  12. ll AA[N], BB[N], AAA[N], BBB[N];
  13. vector<ll> U, V;
  14.  
  15. int prob(int n){
  16.     for(int i = 1; i <= n; ++i){
  17.         scanf("%d", &A[i]);
  18.         AA[i] = hash[A[i]];
  19.         AA[i] += AA[i - 1];
  20.         AAA[i] = hash2[A[i]];
  21.         AAA[i] += AAA[i - 1];
  22.     }
  23.     for(int i = 1; i <= n; ++i){
  24.         scanf("%d", &B[i]);
  25.         BB[i] = hash[B[i]];
  26.         BB[i] += BB[i - 1];
  27.         BBB[i] = hash2[B[i]];
  28.         BBB[i] += BBB[i - 1];
  29.     }
  30.     int cnt = 0;
  31.     for(int i = 2; i <= n; ++i){
  32.         U.clear();
  33.         V.clear();
  34.         for(int j = 1; j <= n - i + 1; ++j){
  35.             U.push_back(BB[i + j - 1] - BB[j - 1]);
  36.             V.push_back(BBB[i + j - 1] - BBB[j - 1]);
  37.         }
  38.         sort(U.begin(), U.end());
  39.         sort(V.begin(), V.end());
  40.         for(int j = 1; j <= n - i + 1; ++j){
  41.             vector<ll>::iterator x = lower_bound(U.begin(), U.end(), AA[i + j - 1] - AA[j - 1]);
  42.             vector<ll>::iterator y = lower_bound(V.begin(), V.end(), AAA[i + j - 1] - AAA[j - 1]);
  43.             if(x != U.end() and *x == AA[i + j - 1] - AA[j - 1] and
  44.                 y != V.end() and *y == AAA[i + j - 1] - AAA[j - 1]) cnt++;
  45.         }
  46.     }
  47.     return cnt;
  48. }
  49.  
  50. int main(){
  51.     srand(97);
  52.     int n;
  53.     for(int i = 0; i < N; ++i) hash[i] = rand();
  54.     for(int i = 0; i < N; ++i) hash2[i] = rand();
  55.     while(true){
  56.         scanf("%d", &n);
  57.         if(n == 0) break;
  58.         printf("%d\n", prob(n));
  59.     }
  60.     return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement