首页 分享 【BZOJ4641】基因改造(KMP)

【BZOJ4641】基因改造(KMP)

来源:花匠小妙招 时间:2025-01-04 07:22

最新推荐文章于 2019-09-23 21:57:53 发布

zxyoi_dreamer 于 2019-09-17 16:41:03 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。

传送门

题解:

我的做法感觉算好写的。

假设在 0 0 0位置上出现了所有字符,那么对于每个串记录每个位置的字符上一次出现位置距离这个位置有多远,然后匹配的时候直接比较上一次出现的位置,注意比较的时候需要取min防止越界。

代码:

#include<bits/stdc++.h> #define ll long long #define re register #define gc get_char #define cs const namespace IO{inline char get_char(){static cs int Rlen=1<<22|1;static char buf[Rlen],*p1,*p2;return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;}template<typename T>inline T get(){char c;T num;while(!isdigit(c=gc()));num=c^48;while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);return num;}inline int gi(){return get<int>();} } using namespace IO; using std::cerr; using std::cout; cs int N=1e6+7; int n,m; int a[N],b[N]; int las[N],nxt[N]; int ans[N],tot; signed main(){ #ifdef zxyoifreopen("DNA.in","r",stdin); #endifint T=gi();int C=gi();while(T--){n=gi(),m=gi();tot=0;memset(las,0,sizeof las);for(int re i=1;i<=n;++i){int v=gi();a[i]=i-las[v];las[v]=i;}memset(las,0,sizeof las);for(int re i=1;i<=m;++i){int v=gi();b[i]=i-las[v];las[v]=i;}for(int re i=2,j=0;i<=m;++i){while(j){int l1=std::min(b[i],j+1),l2=b[j+1];if(l1==l2)break;j=nxt[j];}++j;nxt[i]=j;}for(int re i=1,j=0;i<=n;++i){while(j){int l1=std::min(a[i],j+1),l2=b[j+1];if(l1==l2)break;j=nxt[j];}++j;if(j==m)ans[++tot]=i-m+1,j=nxt[j];}printf("%dn",tot);for(int re i=1;i<=tot;++i)printf("%d ",ans[i]);puts("");}return 0; }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

相关知识

# KMP , 题目:剪花布条( HDU
HDOJ2087剪花布条 (KMP写法)和(普通写法)
KMP 字符串匹配 SDNU 1100 字符串查找 HDU 2087 剪花布条
基因改造使植物叶子变成花瓣
始于种子:基因设计彻底改造马铃薯
没爹也生娃:基因改造首次实现孤雌生殖
人工改造合成的杀虫基因及其编码的蛋白质与应用的制作方法
搜索
花色改造基因工程研究进展
天津保护湿地“绿色基因” 全面升级改造保护区

网址: 【BZOJ4641】基因改造(KMP) https://www.huajiangbk.com/newsview1438922.html

所属分类:花卉
上一篇: 浙江大学工程改造毕赤酵母实现长春
下一篇: 华中农业大学团队成功敲除病虫害基

推荐分享