Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int N,M;
- char spot[500][500], plain[500][500];
- long long expo[500];
- bool v[500][500];
- const long long MOD = 1000000007;
- long long h_sp[500][500][500], h_pl[500][500][500];
- int convert(char a)
- {
- if(a=='A') return 0;
- if(a=='T') return 1;
- if(a=='G') return 2;
- return 3;
- }
- void gen(int a,int b)
- {
- if(v[a][b] || b==M)
- return;
- v[a][b] = 1;
- for (int i=0;i<N;i++)
- {
- if (a < b)
- {
- h_sp[i][a+1][b] = (h_sp[i][a][b] - expo[b-a]*convert(spot[i][a]) + MOD) % MOD;
- h_pl[i][a+1][b] = (h_pl[i][a][b] - expo[b-a]*convert(plain[i][a]) + MOD) % MOD;
- }
- if (b < N)
- {
- h_sp[i][a][b+1] = (h_sp[i][a][b]*4 + convert(spot[i][b+1]) + MOD) % MOD;
- h_pl[i][a][b+1] = (h_pl[i][a][b]*4 + convert(plain[i][b+1]) + MOD) % MOD;
- }
- }
- if (a < b)
- gen(a+1,b);
- if (b < N)
- gen(a,b+1);
- }
- int main()
- {
- // ofstream fout(cownomics.out");
- // ifstream fin("cownomics.in");
- cin >> N >> M;
- string x;
- for (int i=0;i<N;i++)
- {
- cin >> x;
- for (int j=0;j<M;j++)
- spot[i][j] = x[i];
- }
- for (int i=0;i<N;i++)
- {
- cin >> x;
- for (int j=0;j<M;j++)
- plain[i][j] = x[i];
- }
- int b = 1;
- for (int i=0;i<M;i++)
- {
- expo[i] = b;
- b = (b*4) % MOD;
- }
- for (int i=0;i<N;i++)
- {
- h_sp[i][0][0] = convert(spot[i][0]);
- h_pl[i][0][0] = convert(plain[i][0]);
- }
- gen(0,0);
- unordered_set<long long> hs;
- int res = M;
- for (int a=0;a<M;a++)
- for (int b=a;b<M;b++)
- {
- bool can_explain = 1;
- hs.clear();
- for (int i = 0; i < N; i++)
- hs.insert(h_sp[i][a][b]);
- for (int i = 0; i < N; i++)
- if (hs.find(h_pl[i][a][b]) != hs.end()) {
- can_explain = 0;
- break;
- }
- if (can_explain)
- res = min(res,b-a+1);
- }
- cout << res << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement