제출 #1366588

#제출 시각아이디문제언어결과실행 시간메모리
1366588ivazivaGenetics (BOI18_genetics)C++20
27 / 100
1831 ms126812 KiB
#include <bits/stdc++.h>

using namespace std;

#define MAXN 4105
#define int long long 

int n,m,k;
vector<string> vec;
map<char,int> mapa;
set<int> position[4][MAXN];
set<int> possible;
int seg[MAXN*4];

void update(int node,int l,int r,int pos,int val)
{
	if (l==r) seg[node]+=val;
	else
	{
		int mid=(l+r)/2;
		if (pos<=mid) update(2*node,l,mid,pos,val);
		else update(2*node+1,mid+1,r,pos,val);
	}
}

int query(int node,int l,int r,int pos)
{
	if (l==r) return seg[node];
	int mid=(l+r)/2;
	if (pos<=mid) return query(2*node,l,mid,pos);
	else return query(2*node+1,mid+1,r,pos);
}

int32_t main()
{
	cin>>n>>m>>k;for (int i=1;i<=n;i++) {string s;cin>>s;vec.push_back(s);}
	if (n<=100 and m<=100)
	{
		// subtask1 - 27p
		for (int pos=0;pos<n;pos++)
		{
			bool valid=true;
			for (int i=0;i<n;i++)
			{
				if (i==pos) continue;
				int matching=0;
				for (int j=0;j<m;j++)
				{
					if (vec[pos][j]!=vec[i][j]) matching++;
				}
				if (matching!=k) {valid=false;break;}
			}
			if (valid) {cout<<pos+1<<endl;return 0;}
		}
    }
    mapa['A']=0;mapa['C']=1;mapa['G']=2;mapa['T']=3;
    for (int pos=1;pos<=n;pos++) possible.insert(pos);
    for (int pos=1;pos<=n;pos++)
    {
		for (int i=0;i<m;i++) position[mapa[vec[pos-1][i]]][i].insert(pos);
	}
	int answer=-1;
	while (answer==-1)
	{
		int root=*possible.begin();possible.erase(root);
		for (int pos=0;pos<m;pos++) position[mapa[vec[root-1][pos]]][pos].erase(root);
		for (int node=0;node<4*MAXN;node++) seg[node]=m;
		for (int pos=0;pos<m;pos++)
		{
			for (int sled:position[mapa[vec[root-1][pos]]][pos]) update(1,1,n,sled,-1);
	    }
	    vector<int> todelete;
	    for (int node:possible)
	    {
			if (query(1,1,n,node)==k) continue;
			for (int pos=0;pos<m;pos++) position[mapa[vec[node-1][pos]]][pos].erase(node);
			todelete.push_back(node);
		}
		if ((int)todelete.size()==0) {cout<<root<<endl;return 0;}
		for (int node:todelete) possible.erase(node);
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…