众所周知,人类基因可以看作一个碱基对序列,它包含了4种核苷酸,简记为A,C,G,T。让我们观察这样一段基因序列 “ACCAGGTT”,这段序列共由8个核苷酸构成,其中第1位和第4位是碱基‘A’,第2位和第3位是碱基 ‘C’,第5位和第6位是碱基 ‘G’,第7位和第8位是碱基 ‘T’。Openxxx构造了这样一个0,1矩阵:
1, 0, 0, 1, 0, 0, 0, 0
0, 1, 1, 0, 0, 0, 0, 0
0, 1, 1, 0, 0, 0, 0, 0
1, 0, 0, 1, 0, 0, 0, 0
0, 0, 0, 0, 1, 1, 0, 0
0, 0, 0, 0, 1, 1, 0, 0
0, 0, 0, 0, 0, 0, 1, 1
0, 0, 0, 0, 0, 0, 1, 1
如果第i位的碱基与第j位的碱基一样,那么0,1矩阵的i行j列为1,否则为0。如果基因序列X与基因序列Y等长且具有相同的0,1矩阵,Openxxx就会认为X与Y是相似的基因序列。
现在的问题是:给你两段长度为N的基因序列,请你帮助Openxxx判断它们是否相似。
多组测试数据,每组数据第1行输入一个正整数N(1≤N≤1000000),第2行和第3行分别输入两段长度为N的基因序列(只由A,C,G,T四种字符构成)。输入直至文件结尾。
每组数据输出仅一行,如果相似则输出 “YES”,否则输出 “NO”,注意双引号不需要输出。
1
A
G
2
AA
TG
YES
NO
#include<iostream>
using namespace std;
char a[1000001];
char b[1000001];
int main()
{
// freopen("in.txt","r",stdin);
int len,x[26],y[26],visit[26];
int i,count,tmp,ttmp;
while(scanf("%d",&len)!=EOF)
{
getchar();
int ok=1;
memset(visit,0,sizeof(visit));
gets(a);
count=0;
for(i=0;i<len;i++)
{
tmp=a[i]-'A';
if(!visit[tmp])
{
x[tmp]=count++;
visit[tmp]=1;
}
}
gets(b);
count=0;
memset(visit,0,sizeof(visit));
for(i=0;i<len;i++)
{
tmp=b[i]-'A';
if(!visit[tmp])
{
y[tmp]=count++;
visit[tmp]=1;
}
ttmp=a[i]-'A';
if(x[ttmp]!=y[tmp])
{ok=0;break;}
}
if(ok)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}