Submission #378353

#TimeUsernameProblemLanguageResultExecution timeMemory
378353soroushGenetics (BOI18_genetics)C++17
100 / 100
1200 ms93000 KiB
//*
#pragma GCC optimize("O2")
//#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx,avx2,sse,sse2,fma")
//*/
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int , int> pii;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int maxn = 4110;
const ll mod = 1e9+7;
const ld PI = acos((ld)-1);

#define pb push_back
#define endl '\n'
#define dokme(x) cout << x , exit(0)
#define migmig ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define ms(x , y) memset(x , y , sizeof x)
ll pw(ll a, ll b, ll md = mod){ll res = 1;while(b){if(b&1){res=(a*res)%md;}a=(a*a)%md;b>>=1;}return(res);}

int n , m , k;
char s[maxn][maxn];
bool bad[maxn];
int cnt[4][maxn];
bitset < maxn > a[4][maxn];
int diff[maxn][maxn];
std::chrono::duration<double> elapsed_seconds;

int Diff(int i , int j){
	if(diff[i][j] ^ -1)return diff[i][j];
	diff[i][j] = m;
	for(int k = 0 ; k < 4 ; k ++)
		diff[i][j] -= (a[k][i] & a[k][j]).count();
	diff[j][i] = diff[i][j];
	return diff[i][j];
}

void chk(int i){
	if(bad[i])return;
	if(elapsed_seconds.count() > 0.9){
		for(int j = 1 ; j <= n ; j ++)if(j^i){
			if(Diff(i , j) ^ k){
				bad[i] = bad[j] = 1;return;}
		}
	}
	else{
		for(int j = n ; j >= 1 ; j --)if(j^i){
			if(Diff(i , j) ^ k){
				bad[i] = bad[j] = 1;return;}
		}
	}
	dokme(i);
}

void add(int i){
	for(int j = 0 ; j < m ; j ++){
		if(s[i][j] == 'A')cnt[0][j]-- , a[0][i][j] = 1;
		else if(s[i][j] == 'T')cnt[1][j]-- , a[1][i][j] = 1;
		else if(s[i][j] == 'C')cnt[2][j]-- , a[2][i][j] = 1;
		else cnt[3][j]-- , a[3][i][j] = 1;
	}
}


int32_t main(){
	std::chrono::time_point<std::chrono::system_clock> start, end;
    start = std::chrono::system_clock::now();
	cin >> n >> m >> k;
	ms(diff , -1);
	for(int i = 0 ; i < m ; i ++)for(int j = 0 ; j < 4 ; j ++)cnt[j][i] = n;
	for(int i = 1 ; i <= n ; i ++)scanf("%s",s + i) , add(i);
	for(int i = n ; i >= 1 ; i --)if(!bad[i]){
		int sum = 0;
		for(int j = 0 ; j < m ; j ++){
			if(s[i][j] == 'A')sum += cnt[0][j];
			else if(s[i][j] == 'T')sum += cnt[1][j];
			else if(s[i][j] == 'C')sum += cnt[2][j];
			else sum += cnt[3][j];
		}
		if(sum == k * (n - 1))chk(i);
		end = std::chrono::system_clock::now();
		elapsed_seconds = end-start;
		if(elapsed_seconds.count() > 0.9)break;
	}
	for(int i = 1 ; i <= n ; i ++)if(!bad[i]){
		int sum = 0;
		for(int j = 0 ; j < m ; j ++){
			if(s[i][j] == 'A')sum += cnt[0][j];
			else if(s[i][j] == 'T')sum += cnt[1][j];
			else if(s[i][j] == 'C')sum += cnt[2][j];
			else sum += cnt[3][j];
		}
		if(sum == k * (n - 1))chk(i);
	}
	return(0);
}

Compilation message (stderr)

genetics.cpp: In function 'int32_t main()':
genetics.cpp:78:40: warning: format '%s' expects argument of type 'char*', but argument 2 has type 'char (*)[4110]' [-Wformat=]
   78 |  for(int i = 1 ; i <= n ; i ++)scanf("%s",s + i) , add(i);
      |                                       ~^  ~~~~~
      |                                        |    |
      |                                        |    char (*)[4110]
      |                                        char*
genetics.cpp:78:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   78 |  for(int i = 1 ; i <= n ; i ++)scanf("%s",s + i) , add(i);
      |                                ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...