//刚开始数组开的太大了1e6,OLE了,, 后来看错了开的太小4*1e4...RE.。。。后来发现题目要求4*1e5.。。AC
//字符串s的前next[i]长度的字符和后next[i]长度的字符是相同的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
const int N = 4*1e5+5;
int nxt[N];
int cnt = 0;
char s1[N], s2[N];
void GetNext(char s[], int length)
{
int i=0, j=-1;
nxt[0] = -1;//必须有...
while(i < length){
if(j == -1 || s[i] == s[j]){
i++;
j++;
nxt[i] = j;
}
else j = nxt[j];
}
}
int KMP(char s1[], int n, char s2[], int m)
{
int i = 0, j = 0;
while(i < n){
if(j == -1 || s1[i] == s2[j]){
i++;
j++;
}
else
j = nxt[j];
if(j == m){
cnt++;
j = i+1;//用过的根据题意不能再次检测
// j = nxt[j];
}
}
return cnt;
}
int main()
{
int n, cnt;
while(~scanf("%s", s2)){
cnt = 0;
n = strlen(s2);
GetNext(s2, n);
int tmp[n+1], t = nxt[n];
while(t){
tmp[cnt++] = t;
// cout << t << " ";
t = nxt[t];
}
for(int i=cnt-1; ~i; i--){
printf("%d ", tmp[i]);
}
printf("%d\n", n);
}
return 0;
}

本文深入探讨了KMP算法的实现原理,通过一个具体的字符串匹配问题,详细讲解了如何构造next数组,以及如何利用next数组进行高效字符串匹配。文章通过代码示例,展示了KMP算法的具体应用过程。
419

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



