病毒感染检测(运用BF算法)

人的DNA和病毒DNA均表示成由一些字母组成的字符串序列。然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否则没有感染。例如,假设病毒的DNA序列为baa,患者1的DNA序列为aaabbba,则感染,患者2的DNA序列为babbba,则未感染。(注意,人的DNA序列是线性的,而病毒的DNA序列是环状的)

输入格式:

输入第一行中给出1个整数i(1≤i≤11),表示待检测的病毒DNA和患者DNA的对数。
输入i行串序列,每行由两个字符串组成(字符串中不含不可见字符),两字符串之间用一个空格分隔,分别代表病毒的DNA序列和患者的DNA序列,病毒的DNA序列和患者的DNA序列长度不超过500。

输出格式:

依次逐行输出每对检测样本的结果,感染输出:YES,未感染输出:NO。

输入样例1:

1
baa bbaabbba

输出样例1:

YES

输入样例2:

2
cced cdccdcce
bcd aabccdxdxbxa

输出样例2:

YES
NO

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int BF(char S[], char T[], char A[])//BF算法
{
	int i = 0, j = 0;//i标记母串S,j标记子串T
	while (i < strlen(S) && j < strlen(A))
	{
		if (S[i] == T[j])//相等,都往下
		{
			i++;
			j++;
		}
		else//不等,母串回溯
		{
			i = i - j + 1;
			j = 0;
		}
	}
	if (j >= strlen(A)) return 1;
	else return 0;

}
int main()
{
	char a[501], b[501];
	int n, flag = 0;
	cin >> n;//待测对数
	for (int i = 0; i < n; i++)
	{
		cin >> a;//输入病毒串
		getchar();
		cin >> b;//输入DNA
		char c[1000];
		for (int i = 0; i < strlen(a); i++)//病毒串为环串,遍历每种可能
		{
			int k = i;
			for (int j = 0; j < strlen(a); j++)//c赋值为该次判断的病毒串
			{
				c[j] = a[k++];
				if (k % strlen(a) == 0) k = 0;
			}
			if (BF(b, c, a) == 1)//用BF算法判断,病毒串为子串,DNA为母串
			{
				flag = 1;
				break;
			}
			else
				flag = 0;
		}
		if (flag == 1)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
}

 遇到问题有:

1、BF算法中子串长度用病毒长度

2、strlen函数用头文件<string.h>才能过

3、主函数中BF==1后,break跳出循环

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值