病毒感染监测
描述
医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者收集了大量的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了相应的病毒。为方便研究,研究者将人的DNA和病毒的DNA均表示成由一些小写字母组成的字符串,然后检测某种病毒的DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了病毒,否则没有感染。注意:人的DNA序列是线性的,而病毒的DNA序列是环状的。
输入
多组数据,每组数据有一行,为序列A和B,A对应病毒的DNA序列,B对应人的DNA序列。A和B都为“0”时输入结束。
输出
对于每组数据输出一行,若患者感染了病毒输出“YES”,否则输出“NO”。
样例输入1
abbab abbabaab baa cacdvcabacsd abc def 0 0
样例输出1
YES YES NO
解答:病毒DNA序列是环状的,因此将两个相同的病毒DNA组合组成一个新串,截取原来长度的子串作为模式串。将每个模式串与主串进行匹配。
#include<stdio.h>
#include<string.h>
int slen,plen;
int BF(char *s,char *p)
{
int i=1,j=1,t=1;
while(i<=slen && j<=plen)
{
if(s[i]==p[j])
{
i++;
j++;
}
else
{
i=++t;
j=1;
}
}
if(j>plen)
return 1;
else
return 0;
}
int main()
{
char a[100],b[100];
char s[100],p[100];
while(1)
{
scanf("%s %s",b,a);
if(a[0]=='0'&&a[1]=='\0'&&b[0]=='0'&&b[1]=='\0')
break;
slen=strlen(a);
plen=strlen(b);
for(int i=plen; i<2*plen; i++)
b[i]=b[i-plen];
b[2*plen]='\0';
for(int i=1; i<=slen; i++)
{
s[i]=a[i-1];
}
s[slen+1]='\0';
// printf("%s\n",s+1);
int flag=0;
for(int i=0; i<plen; i++)
{
for(int j=1; j<=plen; j++)
{
p[j]=b[i+j-1];
}
p[plen+1]='\0';
// printf("%s\n",p+1);
if(BF(s,p))
{
flag=1;
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

3198

被折叠的 条评论
为什么被折叠?



