南邮 OJ 1502 相似基因

相似基因

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 842            测试通过 : 110 

比赛描述

众所周知,人类基因可以看作一个碱基对序列,它包含了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

提示

 

题目来源

openxxx





/* 93MS
#include<iostream>
#define N 1000001

char a[N],b[N];
char aMap[256],bMap[256];

int main(){
	int n,i;
	while(scanf("%d",&n)==1){
		scanf("%s%s",a,b);
		memset(aMap,0,sizeof(aMap));
		memset(bMap,0,sizeof(bMap));
		for(i=0;i<n;i++){
			if(!aMap[a[i]]){
				aMap[a[i]] = b[i];
			}else if(aMap[a[i]] != b[i]){
				break;
			}
			if(!bMap[b[i]]){
				bMap[b[i]] = a[i];
			}else if(bMap[b[i]] != a[i]){
				break;
			}
		}
		if(i<n){
			printf("NO\n");
		}else{
			printf("YES\n");
		}
	}
}
*/

// 也是93MS
#include<iostream>
#define N 1000001

char a[N],b[N];
char aMap[256],bMap[256];

int main(){
	int n;
	char *pa,*pb;
	while(scanf("%d",&n)==1){
		scanf("%s%s",a,b);
		memset(aMap,0,sizeof(aMap));
		memset(bMap,0,sizeof(bMap));
		for(pa=a,pb=b;*pa;pa++,pb++){
			if(!aMap[*pa]){
				aMap[*pa] = *pb;
			}else if(aMap[*pa] != *pb){
				break;
			}
			if(!bMap[*pb]){
				bMap[*pb] = *pa;
			}else if(bMap[*pb] != *pa){
				break;
			}
		}
		if(*pa){
			printf("NO\n");
		}else{
			printf("YES\n");
		}
	}
}





你可能感兴趣的:(ACM,南邮OJ,相似基因)