医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知他们的DNA序列都是环状的。现在研究者已收集了大量的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了相应的病毒。为了方便研究,研究者将人的DNA和病毒DNA均表示成由一些字母组成的字符串序列,然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,这此人感染了该病毒,否则没有感染。例如,假设病毒的DNA序列为baa,患者1的DNA序列为aaabbba,则感染。患者2的DNA序列为babbba,则未感染。(注意:人的DNA序列是线性的,而病毒的DNA序列是环状的)。

研究者将待检测的数据保存在一个文本文件中,文件格式和内容规定如下:文件有num+1行,第一行有一个整数num,表示有num个待检测的任务(num<=300)。接下来每行i(2<=i<=num+1)对应一个任务,每行有两个数据,用空格分隔,第一个数据表示病毒的DNA序列(长度<=6000),第二个数据表示人的DNA序列(长度<=10000)。

要求将检测结果输出到文件中,文件中包括num行,每行有三个数据,用空格分隔,前两个数据分别表示输入文件中对应病毒的DNA序列和人的DNA序列,如果该人感染了对应的病毒,该行第三个数据则为“YES”,否则为“NO”。

思路:我直接采用的kmp算法,这能有效改善时间复杂度。考虑到病毒基因是环状的,所以弄了个循环来更新匹配数组的值,设置一个标记,用来判断是否匹配。注意要将匹配串清零,以防出错。

注意:有些让用BF来写,本文不再给出代码,可以参考代码写出一个BF函数即可。

#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;char str[12005],pat[12005],pat1[12005];//pat为模式串,str为主串
int Next[12005]; //Next[x]下标x表示匹配失败处字符下标
//模式串pat的前缀与x位置的后缀的最大匹配字符个数-1
void GetNext(char *pat)
{int LenPat = strlen(pat);int i = 0,j = -1;Next[0] = -1;while(i < LenPat){if(j == -1 || pat[i] == pat[j]){i++,j++;Next[i] = j;}elsej = Next[j];}
}int KMP()
{int LenStr = strlen(str);int LenPat = strlen(pat);GetNext(pat);int i = 0,j = 0;while(i < LenStr){if(j == -1 || str[i] == pat[j])i++,j++;elsej = Next[j];if(j == LenPat)return 1;}return -1;//没找到匹配位置
}
int main()
{//freopen("输入文件夹名字","r",stdin);       从文件读取数据//freopen("输出文件夹名字","w",stdout);   输出重定向int n;scanf("%d",&n);while(n--){scanf("%s%s",pat1,str);char s[6005];memset(pat,'\0',sizeof(pat));//每次将pat数组清零bool flag=false;strcpy(s,pat1);int len = strlen(s);strcat(pat1,s);for(int i=0;i<=len;++i){for(int j=0;j<len;++j){pat[j]=pat1[i+j];}//memcpy(pat,pat1+i,len);if(KMP()==1){printf("Yes\n");flag=true;break;}}if(!flag)printf("No\n");}return 0;
}

结果检测

转载于:https://www.cnblogs.com/aerer/p/9930947.html

数据结构实验病毒感染检测问题(C++)相关推荐

  1. 数据结构实验——病毒检测(KMP实现)

    //此代码的NextVal数组以0开头 //需要在工程下建立"病毒感染检测输入数据.txt"文件 #include<iostream> #include<fstr ...

  2. (C语言)数据结构算法-病毒感染检测(BF算法KMP算法)

    病毒感染检测: 医学研究者最近发现了某些新病毒,得知它们的DNA序列都是环状的.为了快速检测出患者是否感染了相应的病毒,研究者将患者的DNA和病毒的DNA均表示成一些字母组成的字符串序列,然后检测某种 ...

  3. 数据结构之病毒感染检测问题

    问题描述: 医学研究者最近发现了某新病毒,通过对这些病毒的分析,得知他们的DNA序列都是环状的.现在研究者已收集了大量 的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了相应的病毒.为了研究方 ...

  4. 数据结构——基于字符串模式匹配算法的病毒感染检测

    实验四 基于字符串模式匹配算法的病毒感染检测 [实验目的] 1.掌握字符串的顺序存储表示方法. 2.掌握字符串模式匹配BF算法和KMP算法的实现. [实验内容] 问题描述 医学研究者最近发现了某些新病 ...

  5. 数据据结构实验4《基于字符串模式匹配算法的病毒感染检测》

    (visual studio 2019可运行) 输入及输出要求见<数据结构C语言(第二版)>严蔚敏版 [本文仅用于啥都看不懂还想交作业选手] //KMP求解基于字符串模式匹配算法的病毒感染 ...

  6. 广州大学 数据结构实验报告

    数据结构 实验一 一.实验目的: 1.线性表的链表实现:遍历.查找.插入.删除.翻转 2.栈的链式存储结构实现:入栈.出栈 3.队列的链式存储结构的实现:入队.出队 4.线性表.栈和队列的应用实现 二 ...

  7. 数据结构实验之链表五:单链表的拆分-sdut

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...

  8. SDUT OJ 数据结构实验之排序一:一趟快排

    数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  9. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

最新文章

  1. Service 层和 Dao 层有必要为每个类都加上接口吗?
  2. TCP释放连接的四次挥手过程
  3. c++批量重命名_文件批量重命名?这个方法百试百灵
  4. 「后端小伙伴来学前端了」Vue中 this.$set的用法 | 可用于修改对象中数组的某一个对象、 可用于更新数据到视图
  5. 驰骋表单设计器 设计表单案例演示
  6. 【Azure Show】|第七期 特别版线上沙龙直播回顾. 嘉宾张坤段清华谭国欣柯克黄炜锵...
  7. 【深搜】骑士游历(二)
  8. [转载] Java 将字符串首字母转为大写 - 利用ASCII码偏移
  9. ggplot2横坐标标签旋转
  10. kibana-7.3.0安装配置
  11. wifi 2.4GHz和5GHz范围
  12. Vue cli3使用vue-awesome-swiper
  13. 计算机网络二进制转化为十进制,二进制如何转十进制?二进制转换十进制公式...
  14. CANCELLED: io.grpc.Context was canclled without error
  15. 第五章 政策问题与议程设定
  16. Mac重启Finder的技巧
  17. MuMu模拟器开发者文档
  18. css图片按键变手指,CSS-悬停button标签时如何使光标变为手形
  19. Linux之xinetd安装及实践
  20. 轩小陌的Python笔记-day16 模块二总结

热门文章

  1. css样式让样式失效,如何让css样式失效
  2. linux 改成utc时间_深度操作系统UTC时间设置怎样改?
  3. 第八章节 文件操作一 (文件对话框)
  4. hdu 6351 Beautiful Now
  5. c语言中字符怎么表示6,6、C语言中的字符串
  6. 百度安装php环境,Centos下安装类百度文库环境
  7. wdatepicker 设置只显示时分_液晶显示多功能电力仪表EX8-33
  8. OpenGL基础36:天空盒
  9. 多重背包(二进制优化)
  10. [Python] 读取存储.mat数据 scipy.io.loadmat(FileName)和scipy.io.savemat('XXX.mat', {'x': x,'y': y,'z': z})