7-1 【模板】KMP字符串匹配 (20 分)
给出两个字符串text和pattern,其中pattern为text的子串,求出pattern在text中所有出现的位置。
为了减少骗分的情况,接下来还要输出子串的前缀数组next。
输入格式:
第一行为一个字符串,即为text。
第二行为一个字符串,即为pattern。
输出格式:
若干行,每行包含一个整数,表示pattern在text中出现的位置。
接下来1行,包括length(pattern)个整数,表示前缀数组next[i]的值,数据间以一个空格分隔,行尾无多余空格。
输入样例:
ABABABC
ABA
结尾无空行
输出样例:
1
3
0 0 1
结尾无空行
样例说明:
C语言
#include#include #include //注意数组从零开始存储 char s[1000005],t[1000005]; int next[1000005]; int lens,lent; void get_next() { int i = 0, j = -1; next[i] = j; while(i < lent) { if(j == -1 || t[j] == t[i]) { i++; j++; next[i] = j; } else j = next[j]; } } int Index_kmp() { int i = 0,j = 0; while(i < lens) { if(j == -1 || s[i] == t[j]) { i++; j++; } else { j = next[j]; } if(j == lent) { printf("%dn",i-j+1); j = next[j]; //下一次寻找 } } } int main() { int i; gets(s); gets(t); lens = strlen(s); lent = strlen(t); get_next(); Index_kmp(); for (i=1; i < lent; i++) printf("%d ",next[i]); printf("%dn",next[lent]); return 0; }
c++
#include#include #include using namespace std; const int MAXN=1000005; char p[MAXN],s[MAXN]; int plen,slen,nxt[MAXN]; void calc_nxt(){ nxt[0]=-1; int k=-1; for(int i=1;i -1&&p[k+1]!=p[i]) k=nxt[k]; if(p[k+1]==p[i]) k++; nxt[i]=k; } } void kmp(){ int k=-1; for(int i=0;i -1&&p[k+1]!=s[i]) k=nxt[k]; if(p[k+1]==s[i]) k++; if(k==plen-1){ printf("%dn",i-plen+2); k=nxt[k];} } } int main(){ scanf("%s",s); scanf("%s",p); slen=strlen(s); plen=strlen(p); calc_nxt(); kmp(); for(int i=0;i



