世界上最富有的人想必大家都已经知道了,是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;
// }
// }
//
}
}