相似基因

  • Description

众所周知,人类基因可以看作一个碱基对序列,它包含了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判断它们是否相似。

  • Input

多组测试数据,每组数据第1行输入一个正整数N(1≤N≤1000000),第2行和第3行分别输入两段长度为N的基因序列(只由A,C,G,T四种字符构成)。输入直至文件结尾。

  • Output

每组数据输出仅一行,如果相似则输出 “YES”,否则输出 “NO”,注意双引号不需要输出。

  • Sample Input

1
A
G
2
AA
TG

  • Sample Output

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;
}

你可能感兴趣的:(相似基因)