Description:

加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个碱基,依然能够表现出吃藕的性状。现在研究人员想知道这个基因在DNA链S0上的位置。所以你需要统计在一个表现出吃藕性状的人的DNA序列S0上,有多少个连续子串可能是该基因,即有多少个S0的连续子串修改小于等于三个字母能够变成S。

Hint:

\(n \le 10^5\)

Solution:

由于字符集较小
考虑分别计算每个字母的不匹配数量,再累加起来
枚举四个字母,把原串的为该字母的位置赋为1,其他赋为0,匹配串反之
这样就能不重不漏的统计出不匹配位置的数量
统计后直接输出<=3的位置

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long ll;
const int mxn=4e5+5,inf=1e9;
const double PI=acos(-1);
int n,m,k,lim=1,ans,l,r[mxn],cnt[mxn];
char s[mxn],t[mxn];inline int read() {char c=getchar(); int x=0,f=1;while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}while(c<='9'&&c>='0') {x=(x<<3)+(x<<1)+(c&15);c=getchar();}return x*f;
}
inline int chkmax(int &x,int y) {if(x<y) x=y;}
inline int chkmin(int &x,int y) {if(x>y) x=y;}struct cp {double x,y;cp (double xx=0,double yy=0) {x=xx,y=yy;}friend cp operator + (cp a,cp b) {return cp(a.x+b.x,a.y+b.y);}friend cp operator - (cp a,cp b) {return cp(a.x-b.x,a.y-b.y);}friend cp operator * (cp a,cp b) {return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
}a[mxn],b[mxn];void FFT(cp *p,int opt)
{for(int i=0;i<lim;++i)if(i<r[i]) swap(p[i],p[r[i]]);for(int mid=1;mid<lim;mid<<=1) {cp wn=cp(cos(PI/mid),opt*sin(PI/mid));for(int len=mid<<1,j=0;j<lim;j+=len) {cp w(1,0);for(int k=0;k<mid;++k,w=w*wn) {cp x=p[j+k],y=w*p[j+mid+k];p[j+k]=x+y,p[j+mid+k]=x-y;}}}
}void solve(char c) {memset(a,0,sizeof(a)); memset(b,0,sizeof(b));for(int i=0,las=-inf;i<n;++i) {if(s[i]!=c) a[i]=1; }for(int i=0;i<m;++i) b[i].x=t[m-i-1]==c;lim=1,l=0;while(lim<=n+m-2) lim<<=1,++l;for(int i=0;i<lim;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));FFT(a,1); FFT(b,1); for(int i=0;i<=lim;++i) a[i]=a[i]*b[i];FFT(a,-1);for(int i=0;i<lim;++i) cnt[i]+=(int )(a[i].x/lim+0.5);}int main()
{int T;cin>>T;while(T--) {memset(cnt,0,sizeof(cnt)); ans=0;scanf("%s %s",s,t); n=strlen(s),m=strlen(t);for(int i=0;i<4;++i) solve("ACTG"[i]);for(int i=m-1;i<n;++i) ans+=cnt[i]<=3;printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/list1/p/10504712.html

[TJOI2017]DNA相关推荐

  1. BZOJ4892: [Tjoi2017]dna

    BZOJ4892: [Tjoi2017]dna Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S, 有这个序列的碱基序列就会表现出喜欢吃藕的性状. 但是研究人员发现 ...

  2. [TJOI2017]DNA --- 后缀数组

    [TJOI2017]DNA 题目描述 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S, 有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个 ...

  3. P3763 [TJOI2017]DNA (FFT)

    原题题面 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列 SSS,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列 SSS,任意修改其中不超过 3 个碱基,依然能够 ...

  4. BZOJ 4892: [Tjoi2017]DNA(SA+RMQ / SAM)

    Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的 性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个碱基,依然能够 ...

  5. 洛谷P3763 [Tjoi2017]DNA 【后缀数组】

    题目链接 洛谷P3763 题解 后缀数组裸题 在BZOJ被卡常到哭QAQ #include<algorithm> #include<iostream> #include< ...

  6. P3763 [TJOI2017]DNA(SAM+dfs)

    LINK SAM写法 记得以前是用 F F T FFT FFT写的,推狮子翻来覆去- 然而这不是被 S A M SAM SAM秒掉的垃圾题吗??!! 建立 S A M SAM SAM,直接从根节点去 ...

  7. 暑假集训 ---- 字符串2 (SAM专题)

    P1368 工艺 把串插入 S A M SAM SAM 插两次,然后贪心找最小字典序即可 [AHOI2013]差异 两个串的最长公共后缀就是后缀自动机上 lca 的长度 于是把两个串反过来,对于每一个 ...

  8. 浅谈 FFT (终于懂一点了~~)

    FFT(离散傅氏变换的快速算法) FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法.即为快速傅氏变换.它是根据离散傅氏变换的奇.偶.虚.实等特性,对离 ...

  9. 2018十二月刷题列表

    Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...

最新文章

  1. Python中双冒号的作用[::]
  2. python400集视频教程 百度云-Python自动化测试视频教程【百度云盘下载】
  3. python函数应用_Python 函数及其应用
  4. 做一个有梦想的咸鱼!
  5. 如何阅读《深入理解计算机系统》?(文末送书)
  6. [蓝桥杯][算法提高VIP]Sharing Chocolate(状压dp记忆化搜索)
  7. 传惠普CEO李艾科将部署全新战略计划
  8. 内存条能4+8混插吗?_笔记本内存条双通道提升有多大?实测FORESEE,你知道好处在哪吗...
  9. 康柏川(帮别人名字作诗)
  10. 机器学习训练建模、集成模型、模型评估等代码总结(2019.05.21更新)
  11. Java8新特性:使用Stream流递归实现遍历树形结构
  12. ubuntu packege下载网址
  13. 计算机关闭远程桌面 共享功能,win7旗舰版系统优化禁止用远程桌面共享的解决方法...
  14. 总线通信协议-PCIe
  15. AE Face Tools 4 脸部工具扩展(中英对照)
  16. 对人工智能的初步认识
  17. Docker进阶 dockerfile指令构建docker镜像
  18. 小程序成四大行业商家标配,小程序代理市场如何
  19. 智能运维探索:有一种多指标异常检测方案,你可能没用过...
  20. HTML打开网页自动播放音乐

热门文章

  1. 以前的(山寨机)手机是怎么逐渐消失的?
  2. 在互联网和信息快速整合的时代
  3. 什么是内容电商?核心是“内容”
  4. 互联网时代,还有闷声发大财的吗?
  5. 对程序员来说最难的是写代码吗?
  6. org.apache.maven.plugins:maven-resources-plugin:2.4.3
  7. C++STL之fill()函数使用方法
  8. C语言实现http的下载
  9. win7php一键,批处理也能干大事之——如何实现Win7系统一键切换用户
  10. sql server父节点_将新节点添加到现有SQL Server Always On可用性组中