人的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
- baa bbaabbba
YES
- 2
- cced cdccdcce
- bcd aabccdxdxbxa
- YES
- NO
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
- #include
- #include
- #include
- 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函数用头文件
3、主函数中BF==1后,break跳出循环