Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define pb push_back
- #define CLR(a) memset(a, 0, sizeof a)
- #define SETDP(a) memset(a, -1, sizeof a)
- #define SETINF(a) memset(a, 127, sizeof a)
- using namespace std;
- typedef long long ll;
- typedef pair<int, int>pii;
- struct S
- {
- ll a, c, g, t;
- S()
- {
- a=c=g=t=0;
- }
- };
- vector<S>masks[4100];
- vector<string>strings;
- ll nmasks, n, m, k;
- int have[27][4110];
- bool chkmask(int id)
- {
- for(int i=0; i<n; i++)
- {
- if(i==id)continue;
- int diff=0;
- for(int j=0; j<nmasks; j++)
- {
- ll maska=masks[id][j].a^masks[i][j].a;
- ll maskc=masks[id][j].c^masks[i][j].c;
- ll maskg=masks[id][j].g^masks[i][j].g;
- ll maskt=masks[id][j].t^masks[i][j].t;
- diff+=__builtin_popcountll(maska);
- diff+=__builtin_popcountll(maskc);
- diff+=__builtin_popcountll(maskg);
- diff+=__builtin_popcountll(maskt);
- }
- if(diff!=k*2)return false;
- }
- return true;
- }
- int main()
- {
- ios_base::sync_with_stdio(false), cin.tie(0);
- cin>>n>>m>>k;
- nmasks=ceil( (double)m/(double)(62));
- for(int i=0; i<n; i++)
- {
- string s;
- cin>>s;
- strings.pb(s);
- for(ll start=0; start<nmasks; start++)
- {
- S cur;
- for(ll j=0; j+start*62<min( (start+1)*62, m); j++)
- {
- if(s[j+start*62]=='A')cur.a+=(1LL<<j);
- else if(s[j+start*62]=='C')cur.c+=(1LL<<j);
- else if(s[j+start*62]=='T')cur.t+=(1LL<<j);
- else cur.g+=(1LL<<j);
- }
- masks[i].pb(cur);
- }
- for(int j=0; j<m; j++)
- have[s[j]-'A'][j]++;
- }
- for(int i=0; i<n; i++)
- {
- int diff=0;
- for(int j=0; j<m; j++)
- diff+=(n-have[strings[i][j]-'A'][j]);
- if(diff==k*(n-1))
- {
- if(chkmask(i))
- {
- cout<<i+1<<"\n";
- return 0;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement