【BZOJ4641】基因改造

Description

"人类智慧的冰峰,只有萌萌哒的我寂寞地守望。"
--TB
TB正走在改造人类智慧基因的路上。TB发现人类智慧基因一点也不萌萌哒,导致人类普遍智商过低,为了拯救低智商人群,博爱的TB开始改造人类智慧基因。人类智慧DNA由C种人类智慧脱氧核苷酸构成(这是一种十分特殊的DNA)。TB智慧DNA片段T长度为M,她可以把另一段长度为M的人类智慧DNA片段S改造成T。改造过程中,TB可以充分发挥智慧,将任意两种人类智慧脱氧核苷酸交换(比如对于片段S=12321,交换1和2变成S=21312,交换1和4变成42324),可以无限次交换。如果S可以通过若干次交换变成T,那么就称S为"萌萌哒人类基因片段"。TB想知道对于一个长度为N的人类智慧DNA片段S[1~N],有多少个长度为M的连续子片段S[i~i+M-1],是"萌萌哒人类基因片段",并且这些"萌萌哒人类基因片段"在哪里。

Input

输入文件的第一行包含两个正整数case和C,分别表示数据组数和人类智慧脱氧核苷酸的种数。
接下来3*case行,每三行表示一组数据:
第一行一个正整数N和M,表示人类智慧DNA片段S和TB智慧DNA片段T的长度。
第二行N个正整数,表示人类智慧DNA片段S。
第三行M个正整数,表示TB智慧DNA片段T。
对于所有数据数据,case=3, n,m,C<=1000000

Output

对于每组数据:
第一行一个正整数tot,表示"萌萌哒人类基因片段"的个数。
接下来一行tot个用空格隔开的正整数pos,表示"萌萌哒人类基因片段"开头所在的位置。要求从小到大输出每个pos。

Sample Input

3 3
6 3
1 2 1 2 3 2
3 1 3
6 3
1 2 1 2 1 2
3 1 3
6 3
1 1 2 1 2 1
3 1 3

Sample Output

3
1 2 4
4
1 2 3 4
3
2 3 4
对于第一组数据:
S[1~3]=121,可以先将1和2交换变成212,再将2和3交换变成313。
S[2~4]=212,可以将2和3交换变成313。
S[4~6]=232,可以先将2和3交换变成323,再将1和2交换变成313。

题解:这种题多做做就差不多能掌握套路了。

显然我们将KMP的比较函数改一改即可,不难想到用pre[i],即i上一次出现的位置来当做判相等的条件。特别地,如果pre[i]超出了S与T匹配的范围,则我们视为pre[i]=-1。细节还是需要注意一下的~

#include <cstdio>
#include <cstring>
#include <iostream> using namespace std;
const int maxn=1000010;
int cas,n,m,C,tot;
int next[maxn],p1[maxn],p2[maxn],pos[maxn],last[maxn];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void work()
{
n=rd(),m=rd(),tot=0;
int i,j,a;
memset(last,-1,sizeof(last));
for(i=0;i<n;i++) a=rd(),p1[i]=(last[a]==-1)?-1:i-last[a],last[a]=i;
memset(last,-1,sizeof(last));
for(i=0;i<m;i++) a=rd(),p2[i]=(last[a]==-1)?-1:i-last[a],last[a]=i;
next[0]=-1,i=0,j=-1;
p1[n]=p2[m]=0;
while(i<m)
{
if(j==-1||p2[i]==p2[j]||(p2[i]>j&&p2[j]==-1)) next[++i]=++j;
else j=next[j];
}
i=j=0;
while(i<n)
{
if(j==-1||p1[i]==p2[j]||(p1[i]>j&&p2[j]==-1)) i++,j++;
else j=next[j];
if(j==m) pos[++tot]=i-m+1;
}
printf("%d\n",tot);
for(i=1;i<=tot;i++) printf("%d ",pos[i]);
printf("\n");
}
int main()
{
cas=rd(),C=rd();
while(cas--) work();
return 0;
}//3 3 6 3 1 2 1 2 3 2 3 1 3 6 3 1 2 1 2 1 2 3 1 3 6 3 1 1 2 1 2 1 3 1 3

【BZOJ4641】基因改造 KMP的更多相关文章

  1. bzoj4641 基因改造 KMP / hash

    依稀记得,$NOIP$之前的我是如此的弱小.... 完全不会$KMP$的写法,只会暴力$hash$.... 大体思路为把一个串的哈希值拆成$26$个字母的位权 即$hash(S) = \sum\lim ...

  2. BZOJ4641 基因改造[KMP]

    这道题以前好像模拟的时候做过,当时不会做,于是用hash水过去了.. 正解是KMP,还是用当前字符与上一次相同字符位置的距离表示数组,于是数值相等时就代表相似.第一次出现用INF代替. 然后要匹配有多 ...

  3. 【bzoj4641】基因改造 特殊匹配条件的KMP

    题目描述 如果两个长度相等的字符串,如果存在一种字符的一一映射,使得第一个字符串的所有字符经过映射后与第二个字符串相同,那么就称它们“匹配”.现在给出两个串,求第一个字符串所有长度等于第二个字符串的长 ...

  4. B 基因改造

    时间限制 : - MS   空间限制 : - KB  问题描述 "人类智慧的冰峰,只有萌萌哒的我寂寞地守望."--TBTB正走在改造人类智慧基因的路上.TB发现人类智慧基因一点也不 ...

  5. KMP 模式串匹配 失去匹配的瞬间你还有什么

    KMP: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法).KMP算法的关键 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 如何做好IT运营.

    定义IT管理的重点在于业务策略与 IT 部门提供的服务之间的一致性.IT 管理可建立必要的管理机制来确保可预测的 IT 服务交付,从而确保业务流程和 IT 流程之间的联系.IT 管理传统上属于CIO. ...

  8. Nature:新发现挑战神经元作用传统理论 [转自科学网]

    美德科学家独立进行的两项最新研究表明,单个神经元的激发就足以影响学习和行为.这一结论挑战了人们长期以来的认识,即数千个神经元的有序排列才能够产生一个行为反应.这两篇论文12月19日在线发表于<自 ...

  9. 癌症免疫细胞治疗知识:CAR-T与TCR-T的区别在哪里?--转载

    肿瘤免疫治疗,实际上分为两大类.一种把肿瘤的特征“告诉”免疫细胞,让它们去定位,并造成杀伤:另一种是解除肿瘤对免疫的耐受/屏蔽作用,让免疫细胞重新认识肿瘤细胞,对肿瘤产生攻击(一般来说,肿瘤细胞会巧妙 ...

随机推荐

  1. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  2. 【转载】XGBoost调参

    General Parameters: Guide the overall functioning Booster Parameters: Guide the individual booster ( ...

  3. ftp客户端的创建

    1.本段代码采用了 select I/O端口复用 2.含有三种功能:ls,  上传文件, 下载文件.这是拷贝别人的代码,自己添加了注释,随后会进行修改, 自己需要的功能:上传文件, 下载文件,  (并 ...

  4. OpenSSL生成证书详解 如何使用OpenSSL生成自签证书 转载

    原文:http://my.oschina.net/fajar/blog/425478 使用OpenSSL生成自签证书(亲测) 一,前言 读过我博客的小伙伴儿都知道,我一般在前言里面会提到为什么写这篇博 ...

  5. php对xml文件的增删改查

    源文件<?xml version="1.0" encoding="utf-8"?><root>  <endTime>2016 ...

  6. 分享分享JavaScript100例-仅供参考

    最近一直在做项目,分享下以前收集的Javascript100例,仅供参考. http://files.cnblogs.com/52net/JavaScript100例.zip

  7. 深入理解C#学习笔记之走出误区

    通过学习深入理解C#这本书,发现自己对于C#这门语言一直存在着三个误区. 第一个误区:结构是轻量级的类: 我一直认为值类型不应该具有方法或其他有意义的行为,它们只应该具有一些简单的属性.但书中总结了一 ...

  8. 矩阵乘法C语言实现

    /* 矩阵乘法C语言实现 Slyar 2009.3.20 */   #include <stdio.h> #include <stdlib.h>   /* 给 int 类型定义 ...

  9. poj Buy Tickets

    题目链接:http://poj.org/problem?id=2828 类似的题目:http://www.cnblogs.com/lovychen/p/3674048.html 测试数据: in: 4 ...

  10. 李洪强iOS开发之iOS技术博客

    李洪强iOS开发之iOS技术博客 注意:访问博客请直接点击博客,不要点击后面的RSS地址 博客地址 RSS地址 南峰子的技术博客   剑尖博客   图拉鼎   Henry Lee   Dev Talk ...