Advertisement
Guest User

Untitled

a guest
Jun 9th, 2019
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int N,M;
  6. char spot[500][500], plain[500][500];
  7. long long expo[500];
  8. bool v[500][500];
  9. const long long MOD = 1000000007;
  10. long long h_sp[500][500][500], h_pl[500][500][500];
  11. int convert(char a)
  12. {
  13.     if(a=='A') return 0;
  14.     if(a=='T') return 1;
  15.     if(a=='G') return 2;
  16.     return 3;
  17. }
  18. void gen(int a,int b)
  19. {
  20.     if(v[a][b] || b==M)
  21.         return;
  22.  
  23.     v[a][b] = 1;
  24.  
  25.     for (int i=0;i<N;i++)
  26.     {
  27.         if (a < b)
  28.         {
  29.             h_sp[i][a+1][b] = (h_sp[i][a][b] - expo[b-a]*convert(spot[i][a]) + MOD) % MOD;
  30.             h_pl[i][a+1][b] = (h_pl[i][a][b] - expo[b-a]*convert(plain[i][a]) + MOD) % MOD;
  31.         }
  32.         if (b < N)
  33.         {
  34.             h_sp[i][a][b+1] = (h_sp[i][a][b]*4 + convert(spot[i][b+1]) + MOD) % MOD;
  35.             h_pl[i][a][b+1] = (h_pl[i][a][b]*4 + convert(plain[i][b+1]) + MOD) % MOD;
  36.         }
  37.     }
  38.     if (a < b)
  39.         gen(a+1,b);
  40.     if (b < N)
  41.         gen(a,b+1);
  42. }
  43. int main()
  44. {
  45. //    ofstream fout(cownomics.out");
  46. //    ifstream fin("cownomics.in");
  47.  
  48.     cin >> N >> M;
  49.  
  50.     string x;
  51.     for (int i=0;i<N;i++)
  52.     {
  53.         cin >> x;
  54.         for (int j=0;j<M;j++)
  55.             spot[i][j] = x[i];
  56.     }
  57.     for (int i=0;i<N;i++)
  58.     {
  59.         cin >> x;
  60.         for (int j=0;j<M;j++)
  61.             plain[i][j] = x[i];
  62.     }
  63.  
  64.     int b = 1;
  65.     for (int i=0;i<M;i++)
  66.     {
  67.         expo[i] = b;
  68.         b = (b*4) % MOD;
  69.     }
  70.  
  71.     for (int i=0;i<N;i++)
  72.     {
  73.         h_sp[i][0][0] = convert(spot[i][0]);
  74.         h_pl[i][0][0] = convert(plain[i][0]);
  75.     }
  76.     gen(0,0);
  77.  
  78.     unordered_set<long long> hs;
  79.     int res = M;
  80.     for (int a=0;a<M;a++)
  81.         for (int b=a;b<M;b++)
  82.         {
  83.             bool can_explain = 1;
  84.             hs.clear();
  85.             for (int i = 0; i < N; i++)
  86.                 hs.insert(h_sp[i][a][b]);
  87.             for (int i = 0; i < N; i++)
  88.                 if (hs.find(h_pl[i][a][b]) != hs.end()) {
  89.                     can_explain = 0;
  90.                     break;
  91.                 }
  92.             if (can_explain)
  93.                 res = min(res,b-a+1);
  94.         }
  95.  
  96.     cout << res << "\n";
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement