测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A32889. 基因组分析程序文件名:t5.cpp输入文件名:t5.in输出文件名:t5.out。乌龟得到了他的基因组,一个只包含“ATCG”四种字母的字符串。乌龟想起科学家说,基因组中很多片段都多次重复出现,而且这种重复是很有意义的,于是他想计算一下自己基因组里片段的重复情况。给定一个基因组,其中一个长度为k 的子串称为一个“k-片段”。乌龟希望你计算出基因组中不同的k-片段数量。例如,基因组“TACAC” …

填空题 困难

题目描述

基因组分析

程序文件名:t5.cpp

输入文件名:t5.in

输出文件名:t5.out。

乌龟得到了他的基因组,一个只包含“ATCG”四种字母的字符串。乌龟想起科学家说,基因组中很多片段都多次重复出现,而且这种重复是很有意义的,于是他想计算一下自己基因组里片段的重复情况。给定一个基因组,其中一个长度为k 的子串称为一个“k-片段”。乌龟希望你计算出基因组中不同的k-片段数量。例如,基因组“TACAC” 的2-片段有“TA”,“AC”, “CA”, “AC”,其中不同的片段数量有3 个。

输入

整数n, k, R1,表示基因组的长度、片段的长度和数列生成的首项。基因组第i (1 _ i _ n) 个字符在Ri mod 4 的值为0, 1, 2, 3 时分别为A, T, C, G

输出

一个整数,表示不同的k-片段的数量

样例输入

20 2 37

样例输出

10

数据规模

30% 的数据满足n<=100; 100%的数据满足1<=n<=10^5, 1<=k<= 10

参考答案

#include<bits/stdc++.h> using namespace std; int a[100010],r[100010],ha[2000000]; int n,k,t=1,ans,sum; void init() { cin>>n>>k>>r[1]; for(int i=1;i<=n;++i){ a[i]=r[i]%4; r[i+1]=(r[i]*6807+2831)%201701; } } int main() { freopen("t5.in","r",stdin); freopen("t5.out","w",stdout); init(); for(int i=1;i<=k;++i){ sum=sum+a[i]*t; t=t*4; } ha[sum]=1;t=t/4; for(int i=k+1;i<=n;++i){ sum=sum/4; sum=sum+a[i]*t; ha[sum]=1; } for(int i=0;i<2000000;++i) if(ha[i]==1)ans++; cout<<ans; fclose(stdin);fclose(stdout); return 0; }
上一题 下一题