[Codeforces Round #295]DNA Alignment

本文探讨了生物信息学领域中通过发明一种新的方法来确定循环DNA序列相似性的过程。详细介绍了如何计算两个序列之间的相似度,以及如何通过左移循环变换来定义Vasya距离。此外,文章还提出了如何计算满足特定Vasya距离最大值的序列数量,并且给出了求解此类问题的算法实现。

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

Description

Vasya became interested in bioinformatics. He’s going to write an article about similar cyclic DNA sequences, so he invented a new method for determining the similarity of cyclic sequences.

Let’s assume that strings s and t have the same length n, then the function h(s, t) is defined as the number of positions in which the respective symbols of s and t are the same. Function h(s, t) can be used to define the function of Vasya distance ρ(s, t):

这里写图片描述
where is obtained from string s, by applying left circular shift i times. For example,
这里写图片描述

Vasya found a string s of length n on the Internet. Now he wants to count how many strings t there are such that the Vasya distance from the string s attains maximum possible value. Formally speaking, t must satisfy the equation: .

Vasya could not try all possible strings to find an answer, so he needs your help. As the answer may be very large, count the number of such strings modulo 109 + 7.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 105).
The second line of the input contains a single string of length n, consisting of characters “ACGT”.

Output

Print a single number — the answer modulo 109 + 7.

Sample test(s)

input
1
C

output
1

input
2
AG

output
4

input
3
TTT

output
1

Note

Please note that if for two distinct strings t1 and t2 values ρ(s, t1) и ρ(s, t2) are maximum among all possible t, then both strings must be taken into account in the answer even if one of them can be obtained by a circular shift of another one.

In the first sample, there is ρ(“C”, “C”) = 1, for the remaining strings t of length 1 the value of ρ(s, t) is 0.

In the second sample, ρ(“AG”, “AG”) = ρ(“AG”, “GA”) = ρ(“AG”, “AA”) = ρ(“AG”, “GG”) = 4.

In the third sample, ρ(“TTT”, “TTT”) = 27

My Problem Report

这道题的核心是解决两个问题,第一是如何求p函数和shift函数,第二是如何求p值最大的字符串的数目。
第一个问题

很容易可以看出,长度为n的字符串,需要shift n^2次。
shift操作可进一步简化

假设字符串分别为A和B,我们按A串的字符顺序(循环),依次往它尾部添加字符,直到其长度为n+n^2-1,我们把新串叫做A’
保持延长后的A’串不动,B串串头与A’串串头对齐,并一位位向后移动,一共移动n+n^2-1次,加上初始状态,一共匹配了n^2次。如图所示:

AGAGA
AG
AGAGA
~AG
AGAGA
~~AG
AGAGA
~~~AG

第二个问题

在构造B串的过程中,我们发现,我们所选取的每一个字母,在都是在A串中出现次数最多的字母,例如有A串

AGCTT

其中T出现了两次,我们只能构造这样的一个B串

TTTTT

若出现次数最多的字母不唯一,那么相当于B串每一位我们都有不唯一的选择,设我们有x种选择,那么最后构造出的B串种数就是x^n,因此我们就可以得到最终答案:x^n mod 10e9+7

My Code

//  Created by Chlerry in 2015.
//  Copyright (c) 2015 Chlerry. All rights reserved.
//  http://codeforces.com/contest/520/problem/C

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define ll long long
const ll M=1000000007;
int n;
string input;
map<char,ll> a;
const string s="ATCG";
ll maxn=-1,cnt,ans=1;

int main()
{
    //freopen("in.txt","r",stdin);
    cin>>n>>input;
    for(int i=0;i<n;i++)
        a[input[i]]++;
    for(int i=0;i<4;i++)
        if(a[s[i]]==maxn)
            cnt++;
        else if(a[s[i]]>maxn)
        {
            maxn=a[s[i]];
            cnt=1;
        }
    for(int i=0;i<n;i++)
        ans=(ans*cnt)%M;
    cout<<ans<<endl;
    return 0;
}
内容概要:本文档详细介绍了基于Python的在线二手电子产品回收系统的设计与实现。项目旨在通过构建一个可靠、安全、透明的平台,提高废旧电子产品的回收率,推动资源的合理再利用,提供安全可靠的交易平台,加强环保意识,促进二手市场的发展,并实现数据驱动的智能化服务。项目面临的主要挑战包括废旧电子产品的检测与评估、信息不对称与交易风险、市场需求的预测与定价、用户体验优化及平台的安全性与数据保护。解决方案涵盖智能化评估与回收定价、高效的二手产品处理流程、完善的售后保障体系、创新的市场需求分析、全程透明化与安全性保障以及定制化用户体验。系统采用微服务架构,包括用户管理、商品评估、交易管理、数据分析、支付与结算等模块。项目还涉及前端界面设计、API接口开发、数据库设计与实现、模型训练与优化、部署与应用等方面。 适合人群:具备一定编程基础,特别是对Python和Web开发有一定了解的研发人员,以及对二手电子产品回收和环保事业感兴趣的从业者。 使用场景及目标:①帮助用户方便地将闲置电子产品回收、交易或再利用,提高废旧电子产品的回收率;②通过智能化的数据分析为用户提供价格评估、市场需求分析等服务,提高回收效率;③提供安全可靠的交易平台,确保交易的公平性和安全性;④推动二手市场的健康发展,为消费者提供经济实惠的产品选择;⑤增强公众的环保意识,推动社会向绿色、低碳方向发展。 其他说明:本文档不仅提供了系统的功能模块设计、数据库表结构、API接口规范,还展示了具体代码实现和GUI界面设计,为开发者提供了全面的技术参考。此外,项目强调了数据安全和隐私保护的重要性,确保平台在运行过程中能够有效保护用户信息。项目未来改进方向包括增强模型的精准度、拓展国际市场、提供更多支付和融资选项、跨平台数据集成与分析、更加智能的回收流程以及强化社交化与社区功能。
内容概要:本文档详细介绍了基于C语言和单片机设计的固态继电器驱动空调温控系统,涵盖了从硬件电路设计、程序设计、GUI设计到代码详解的完整流程。项目旨在实现高效精准的温度控制、提升系统可靠性和寿命、灵活的参数设置和人机交互、降低能耗、模块化设计便于扩展与维护,以及促进智能家居与工业自动化发展。项目通过高精度温度采集与滤波算法、固态继电器驱动与保护电路设计、滞环控制算法、多层次软件模块化设计等创新点,确保系统的高效节能、智能化和高可靠性。; 适合人群:具备一定单片机和C语言编程基础的研发人员,尤其是从事嵌入式系统设计、智能家居和工业自动化领域的工程师。; 使用场景及目标:①实现高效精准的温度控制,确保室内温度维持在理想范围;②提升系统可靠性和寿命,减少故障率和维护成本;③支持灵活的参数设置和用户友好的人机交互界面,提升用户体验;④降低能耗,实现节能控制,推动绿色建筑和节能环保产业的发展;⑤通过模块化设计,便于后续功能升级和系统扩展,如远程监控、数据分析等智能化功能。; 其他说明:项目设计充分考虑了实际应用中的挑战,如温度采集的精度与稳定性、电气兼容性、系统响应速度与控制稳定性、软件设计的资源优化与抗干扰等,提出了针对性的解决方案。系统不仅适用于家庭智能空调,还能广泛应用于工业、商业建筑、医疗环境及农业温室等多个领域。未来改进方向包括智能温度预测与自适应控制、多传感器融合技术应用、远程监控与云平台集成、低功耗与绿色节能优化等。通过该系统,不仅能够精确控制室内温度,保障舒适环境,还能有效节能,延长设备使用寿命,具有重要的实际应用价值和推广意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值