Submission #895674

#TimeUsernameProblemLanguageResultExecution timeMemory
895674pccGenetics (BOI18_genetics)C++14
27 / 100
2027 ms19184 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,popcnt") #define ll long long #define pll pair<ll,ll> #define pii pair<int,int> #define fs first #define sc second #define tlll tuple<ll,ll,ll> int N,M,K; namespace SMALL{ const int mxn = 4140; int perm[mxn],pos[mxn]; short arr[mxn][mxn]; vector<short> v,cand; const short magic = sqrt(mxn)/2; bitset<mxn> in; const int lim = 1.95*CLOCKS_PER_SEC; int st; short dif(short a,short b){ short re = 0; for(short i = 0;i<M;i++){ re += (arr[a][i] != arr[b][i]); } return re; } void collect(){ for(short i = 0;i<N;i++){ for(short j = i+1;j<N;j++){ if(dif(i,j) != K){ if(!in[i])v.push_back(i); if(!in[j])v.push_back(j); if(v.size()>=magic)return; in[i] = in[j] = true; } } if(!in[i]){ cout<<perm[i]+1; exit(0); } } return; } void solve(){ for(int i = 0;i<N;i++)perm[i] = i; srand(time(NULL)); //random_shuffle(perm,perm+N); reverse(perm,perm+N); for(int i = 0;i<N;i++)pos[perm[i]] = i; for(int i = 0;i<N;i++){ for(int j = 0;j<M;j++){ char c; cin>>c; arr[pos[i]][j] = c-'A'; } } collect(); for(int i = 0;i<N;i++){ if(in[i])continue; bool flag = true; for(auto &j:v){ if(dif(i,j) != K)flag = false; } if(flag)cand.push_back(i); } //assert(cand.size()<magic); for(auto &i:cand){ bool flag = true; for(int j = 0;j<N;j++){ if(i == j)continue; if(dif(i,j) != K){ flag = false; break; } } if(flag){ cout<<perm[i]+1; return; } } assert(false); } } namespace TWO{ const int mxn = 4140; bitset<mxn> dp[mxn]; string in; int arr[mxn],pos[mxn]; void solve(){ for(int i = 0;i<N;i++)arr[i] = i; srand(time(NULL)); random_shuffle(arr,arr+N); for(int i = 0;i<N;i++)pos[arr[i]] = i; for(int i = 0;i<N;i++){ cin>>in; int now = pos[i]; for(int j = 0;j<M;j++){ if(in[j] == 'A')dp[now][j] = true; } } /* for(int i = 0;i<N;i++)cout<<arr[i]<<' ';cout<<endl; for(int i = 0;i<N;i++){ for(int j = 0;j<M;j++)cout<<(dp[i][j]?'A':'C'); cout<<endl; } */ for(int i = 0;i<N;i++){ bool flag = true; for(int j = 0;j<N;j++){ if(i == j)continue; //cout<<i<<','<<j<<":"<<(dp[i]^dp[j]).count()<<endl; if(!flag)break; if((dp[i]^dp[j]).count() != K)flag = false; } if(flag){ cout<<arr[i]+1; return; } } } } int main(){ ios::sync_with_stdio(0);cin.tie(0); cin>>N>>M>>K; SMALL::solve();return 0; if(N*M<=1e6)SMALL::solve(); else TWO::solve(); }

Compilation message (stderr)

genetics.cpp: In function 'void TWO::solve()':
genetics.cpp:128:29: warning: comparison of integer expressions of different signedness: 'std::size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  128 |    if((dp[i]^dp[j]).count() != K)flag = false;
      |       ~~~~~~~~~~~~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...