【字符串】NOI--ch0107--03 基因相关性(简单题,注意细节)

本文介绍了一种用于判断两条DNA序列是否具有相关性的算法。通过计算相同碱基对占总碱基对数量的比例,并与给定阈值比较,确定两序列的相关性。文章提供了具体的实现代码及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


 【字符串】NOI--ch0107--03  基因相关性

题目链接→NOI--ch0107--03 基因相关性

Accept: 0    Submit: 0
Time Limit: 1 second    Memory Limit : 131072 KB

 Problem Description

为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的DNA进行比对,以判断该比对的DNA是否具有相关性。

现比对两条长度相同的DNA序列。首先定义两条DNA序列相同位置的碱基为一个碱基对,如果一个碱基对中的两个碱基相同的话,则称为相同碱基对。接着计算相同碱基对占总碱基对数量的比例,如果该比例大于等于给定阈值时则判定该两条DNA序列是相关的,否则不相关。

 Input

有三行,第一行是用来判定出两条DNA序列是否相关的阈值,随后2行是两条DNA序列(长度不大于500)。

 Output

若两条DNA序列相关,则输出“yes”,否则输出“no”。

 Sample Input

0.85
ATCGCCGTAAGTAACGGTTTTAAATAGGCC
ATCGCCGGAAGTAACGGTCTTAAATAGGCC

 Sample Output

yes

 Hint


 Problem Idea

解题思路:

【题意】
求两个字符数组相同位置的相同字符个数。


【类型】
字符串

【分析】

这道题有两个注意点:

1.在读入阈值后需要再getchar()读一个回车,或者用cin.get()读回车;

2.在计算相同碱基对占总碱基对数量的比例时,不能用int/int,至少也要int/double或者int/float;不然测试样例数据时会得到相反的结果

【时间复杂度&&优化】
O(n)

题目链接→NOI--ch0107--03 基因相关性

 Source Code


#include <iostream>
#include <cstring>
using namespace std;
int main() {
    int count=0;
    float r;
    char s1[501];
    char s2[501];
    cin>>r;
    cin.get();//char ch=getchar();
    gets(s1); //cin.getline(s1,501);
    gets(s2); //cin.getline(s2,501);
    int len=strlen(s1);
    for(int i=0;i<len;i++){
       if(s1[i]==s2[i]){
           count++;
       }
   }
    //cout<<count<<endl;
    float rc=count/(double)len;
    //cout<<rc<<endl;
    if(rc>=r){
        cout<<"yes"<<endl;
    }
    else{
        cout<<"no"<<endl;
    }
    return 0;
}

### 关于NOI金牌导航中的字符串算法与后缀数组 在处理涉及多个字符串连接并构建其后缀数组的问时,一种有效的方法是在这些字符串之间插入不同的分隔符[^1]。此方法确保了即使原始字符串内部存在重复部分,在计算后缀数组过程中仍能区分来自不同源字符串的部分。 对于具体实现而言,当面对需要高效查询和匹配的任务时,除了基本的后缀数组外,还可以考虑使用更高级的数据结构如广义SAM(Suffix Automaton),这有助于统计本质不同的子串数量以及其他复杂的模式识别操作[^3]。然而值得注意的是,并不是所有情况下都适合采用最复杂的数据结构;有时简单的基于后缀数组的操作已经能够满足需求,尤其是在时间复杂度要求较为严格的情况下——例如通过二分法配合后缀分组来解决问可以达到\(O(n\log n)\)的时间效率。 针对特定应用场景下的性能优化也至关重要。某些场景下,尽管理论上可行的做法可能因为实际输入特性而表现不佳,比如高度随机化的Height数组可能导致较高复杂度算法超时(TLE),此时就需要根据具体情况调整策略以适应数据特点[^5]。 ```cpp // 示例代码:简单展示如何创建两个字符串之间的后缀数组 #include <iostream> #include <vector> #include <string> using namespace std; void build_suffix_array(const string &text, vector<int> &suffixArray){ int n = text.size(); suffixArray.resize(n); // 构造后缀数组逻辑... } int main(){ string s1="abc",s2="def"; char separator='#'; // 假设'#'不在任何给定字符串内出现 string combinedString=s1+separator+s2; vector<int> sa; build_suffix_array(combinedString,sa); cout << "Combined String with Separator: " << combinedString << endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值