寒假集训——KMP

KMP的课程已经学过去了,今天补上KMP内容。

KMP的原理太复杂没搞懂,代码虽然比较少,但还是很抽象。

P3375 【模板】KMP

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
char a[N], b[N];
int ne[N];
int main()
{
	int i, j;
	cin >> a + 1 >> b + 1; //a是长文本,b是模式串
	int n = strlen(a + 1);
	int m = strlen(b + 1);
	for (i = 2, j = 0; i <= m; i++) //求模式串的Next数组
	{
		while (j && b[i] != b[j + 1])
			j = ne[j];
		if (b[i] == b[j + 1])
			j++;
		ne[i] = j;
	}
//	匹配
	for (i = 1, j = 0; i <= n; i++)
	{
		while (j && a[i] != b[j + 1])
			j = ne[j];
		if (a[i] == b[j + 1])
			j++;
		if (j == m)
		{
			cout << i - m + 1 << endl;
			j = ne[j];
//			匹配成功
		}
	}
	for (i = 1; i <= m; i++)
		cout << ne[i] << " ";
//		对于其每个前缀 s1的最长 border t1的长度
}

// s[]是长文本,p[]是模式串,n是s的长度,m是p的长度
求模式串的Next数组:
for (int i = 2, j = 0; i <= m; i ++ )
{
    while (j && p[i] != p[j + 1]) j = ne[j];
    if (p[i] == p[j + 1]) j ++ ;
    ne[i] = j;
}

// 匹配
for (int i = 1, j = 0; i <= n; i ++ )
{
    while (j && s[i] != p[j + 1]) j = ne[j];
    if (s[i] == p[j + 1]) j ++ ;
    if (j == m)
    {
        j = ne[j];
        // 匹配成功后的逻辑
    }
}

posted @ 2024-07-05 17:41  ZhangDT  阅读(0)  评论(0编辑  收藏  举报