2022.10.16这个测试案例消耗了我很大的精力,先是打不出来去蹭了节课,然后11-16号就一直拌在这,后两关SqString那部分调用还没处理清楚。啊对对还不能跳关。先把前面这些扔在这里。
任务描述
本关任务: 给出两个字符串text和pattern,其中pattern为text的子串,求出pattern在text中所有出现的位置。
编程要求:
给出两个字符串text和pattern,其中pattern为text的子串,求出pattern在text中所有出现的位置。
为了减少骗分的情况,接下来还要输出子串的前缀数组next。
各种格式
输入格式:
第一行为一个字符串,即为text。
第二行为一个字符串,即为pattern。
输出格式:
若干行,每行包含一个整数,表示pattern在text中出现的位置。
接下来1行,包括length(pattern)个整数,表示前缀数组next[i]的值,数据间以一个空格分隔,行尾无多余空格。
输入样例:
ABABABC
ABA
输出样例:
1
3
0 0 1
样例说明:
kmp算法匹配示例
提示: 对于100%的数据:text长度<=1000000,pattern长度<=1000000
开始你的任务吧,祝你成功!
C++代码
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const int N = 1e6 + 1;
int lps[N];
void get_lps(string pat, int * lps) {
int m = pat.length();
int j = 0, i = 1;
lps[0] = 0;
while (i < m) {
if (pat[j] == pat[i]) {
j++;
lps[i] = j;
i++;
} else if (j != 0) {
j = lps[j - 1];
} else {
lps[i] = 0;
i++;
}
}
}
/**
* txt: 字符串
* pat: 模式串
* 输出pat在txt中出现的位置
* 输出next[]数组的值
*/
void KMP(string txt, string pat)
{
//请在下面编写代码
/*************************Begin*********************/
int n = txt.length();
int m = pat.length();
int i = 0;
int j = 0;
get_lps(pat, lps);
while (i < n && j < m) {
if (txt[i] == pat[j]) {
i++; j++;
} else if (j != 0) {
j = lps[j - 1];
} else {
i++;
}
if (j == m) {
cout << i - j + 1 << endl;
j = lps[j - 1];
}
}
for (j = 0; j < m; j++) {
cout << lps[j];
if (j < m - 1)cout << " ";
}
cout << endl;
/**************************End**********************/
}
int main(int argc, char const *argv[])
{
string txt, pat;
cin >> txt >> pat; //输入文本串和模式串
KMP(txt, pat); //调用kmp算法输出模式串在文本串中的位置以及next[]数组的值
return 0;
}