恢复基因链 (20分)

世界上最富有的人想必大家都已经知道了,是garden,由于garden钱实在是太多了,他投了大量的钱给科学研究室,但是最近科学研究室发现了一些缺失的基因链,他们一时间不能马上恢复这个基因链,于是,garden打算重金悬赏能恢复这些基因链的勇士。 首先给出一条字符串,仅含有’A’,‘C’,‘G’,‘T’,’?’,5种字符,其中?代码缺失的基因,已知该基因为猛犸象基因,即基因链中,ACGT每一种核苷酸数量相等,现在要求大家能恢复其原来的基因链,如果答案存在多种情况,输出字典序最小的基因链。

输入格式:
第一行包含整数n(4≤n≤255) - 基因组的长度。

第二行包含长度为n的字符串编码的基因组。它由字符’A’,‘C’,‘G’,‘T’和’?'组成。

输出格式:
如果可以解码基因组,输出。如果有多个答案,输出字典序最小的基因链。如果不可能,输出-1

输入样例:
在这里给出一组输入。例如:

8
AG?C??CT
4
AGCT
6
????G?

输出样例:
在这里给出相应的输出。例如:

AGACGTCT
AGCT
-1

这个题,实现每个字母出现的次数一定是n/4,并且n一定是4的倍数,然后开始按照ACGT的顺序在?处枚举这几个字符,注意每个字母不要超过n/4,左后如果枚举完后字符串中仍然有?,表示无解,输出-1.枚举成功输出即可

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<cstring>
#include<map>
using namespace std;
int mp[256];
int main(){
	int n;
	string str;
	string str2="ACGT";
	while(cin>>n){
		fill(mp,mp+256,0);
		cin>>str;
		int max=1;
		for(int i=0;str[i];i++){
			mp[str[i]]++;
			if(str[i]!='?'&&mp[str[i]]>max)max=mp[str[i]];
		}
		for(int i=0;str[i];i++){
			if(str[i]=='?'){
				for(int j=0;j<4;j++){
					if(mp[str2[j]]<n/4){
						mp[str2[j]]++;
						str[i]=str2[j];
						break;
					}
				}
			}
		}
		for(int i=0;str[i];i++){
			if(str[i]=='?'||mp[str[i]]>n/4){
				cout<<-1<<endl;
				goto out;
			}
		}
		cout<<str<<endl;
		out:;
//		for(vector<int>::iterator it=mp.begin();it!=mp.end();it++){
//			if(it->second>max){
//				max=it->second;
//			}
//		}
//		
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值