分两行输入给出两个字符串:"文本主串"和"模式串"。求模式串的next数组,以及模式串在text中所有出现的位置。输入格式: 第一行输入字符主串,统一规定长度不超过100。第二行输入模式串,长度不超过主串长度。输出格式: 第一行输出前缀数组next[i]的所有值,每个数值间以一个空格分隔,行尾无多余空格。后面分若干行,每行输出模式串在主串中匹配的位置。有1次匹配成功则输出一行位置信息,有n次匹配成功,则输出n行匹配成功的位置信息。如果没有匹配成功,则输出匹配位置信息为0,用c语言编写
时间: 2023-06-10 18:07:37 浏览: 77
```
#include <stdio.h>
#include <string.h>
void get_next(char* p, int* next) {
int m = strlen(p);
next[0] = -1;
int i = -1, j = 0;
while (j < m - 1) {
if (i == -1 || p[i] == p[j]) {
i++;
j++;
next[j] = i;
} else {
i = next[i];
}
}
}
void kmp(char* t, char* p, int* next) {
int n = strlen(t), m = strlen(p);
int i = 0, j = 0;
while (i < n && j < m) {
if (j == -1 || t[i] == p[j]) {
i++;
j++;
} else {
j = next[j];
}
if (j == m) {
printf("%d\n", i - j);
j = next[j];
}
}
if (j == 0) {
printf("0\n");
}
}
int main() {
char t[105], p[105];
scanf("%s%s", t, p);
int next[105];
get_next(p, next);
for (int i = 0; i < strlen(p); i++) {
printf("%d ", next[i]);
}
printf("\n");
kmp(t, p, next);
return 0;
}
```
阅读全文