/*
DNA配对,简单的搜索删除而已,一边插入一边就在判断(正反序均判断)
*/
/*
Run Time: 0secs
Run Memory: 312KB
*/
#include <iostream>
#include <string>
#include <set>
using namespace std;
int N; //1-100
string lists[101];
set<string> pool;
int num;
//获取一个串的配对串
string getPartner(string input){
for(int i=0; i<input.length(); i++){
if(input[i] == 'A')
input[i] = 'T';
else if(input[i] == 'T')
input[i] = 'A';
else if(input[i] == 'C')
input[i] = 'G';
else if(input[i] == 'G')
input[i] = 'C';
}
return input;
}
//获取一个串的逆序
string getAnti(string input){
char buf[input.length()];
for(int i=input.length()-1,j=0; i>=0; i--,j++)
buf[j] = input[i];
string s(buf, input.length());
return s;
}
int main()
{
int T;
cin >> T;
while (T>0){
num = 0;
cin >> N;
for(int i=0; i<N; i++)
cin >> lists[i];
for(int i=0; i<N; i++){
string buf = lists[i];
set<string>::iterator iter = pool.find(buf);
if(iter != pool.end()){ //说明找到有对应的了,则计数器+1,同时删除曾经插入的序列及其反序列
num++;
pool.erase(buf);
pool.erase(getAnti(buf));
}else{ //没有找到配对,此时获取当前序列的配对序列,将其本身以及其反序存入pool
string partner = getPartner(buf);
pool.insert(partner);
pool.insert(getAnti(partner));
}
}
cout << num << endl;
T--;
}
return 0;
}
Sicily 1035. DNA matching
最新推荐文章于 2021-03-01 21:34:45 发布