恢复基因链 (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?
1
2
3
4
5
6
输出样例:
在这里给出相应的输出。例如:

AGACGTCT
AGCT
-1
 

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;
const int maxn=10010;
const int N=10;

int main(){
	
	int n;
	string str;
	
	while(cin>>n>>str){
		
		if(n%4){
			printf("-1\n"); continue;
		}
		
		int k=n/4;
		int cnt[127]={0};
		
		for(int i=0;i<n;i++) cnt[str[i]]++;
		
		
		int a=k-cnt['A'];// 1
		int c=k-cnt['C'];// 0
		int g=k-cnt['G'];// 1
		int t=k-cnt['T'];// 1
		
		int sum=a+c+g+t;
		
		if(sum!=cnt['?']) {
			printf("-1\n"); continue;
		}
		
		for(int i=0;i<n;i++){
			
			if(str[i]!='?') { 
			cout<<str[i]; continue;	
			}
			
			if(a)      { a--;  putchar('A');}
			else if(c) { c--;  putchar('C');}
			else if(g) { g--;  putchar('G');}
			else if(t) { t--;  putchar('T');}
			
		}
		puts("");
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值