学习KMP中的一点小见解

之所以今天非要写个博客就是因为我觉得自己拖延症又犯了,立个flag,今天要把kmp最简单的部分搞懂并写几道题,其实现在那道题并没有搞懂,但是只要你们看到这篇文章就说明我的题终于那道题终于搞懂了hhhh
希望我的flag不会倒(小声哔哔)

在某辣鸡安的浅薄认知中,kmp一般会用来解字符串比对问题,先写了个简单的字符串比对板子题
做了洛谷的一道板子题,用了kmp居然还tle了,麻了……这这这,真是没谁了……
P3375 【模板】KMP字符串匹配
终于ac了,上AC代码

```cpp
#include <bits/stdc++.h>
using namespace std;
char s1[1000100], s2[1000100];
int nextt[1000100];
void getnextt(int l);
void judge(int l, int ll);

int main() {
	cin >> s1+1 >> s2+1;         //	第一个字母是s1【1】而非s1【0】; 
	int ll = strlen(s1+1), l = strlen(s2+1);
	judge(l, ll);
	for (int i0 = 1; i0 <= l; i0++) {
		cout << nextt[i0] << " ";
	}
	return 0;
}
void getnextt(int l) {				//找nextt数组的方式(样串自己和自己比较)
	memset(nextt, 0, sizeof(nextt));
	int j1 = 0;
	for (int i1 = 2; i1 <= l; i1++) {//因为自己和自己比较所以从s2【2】和是s2【1】比,i1从2开始而不是1开始
		while (j1 && s2[j1+1] != s2[i1]) j1 = nextt[j1];//j1如果是0就不需要比较了,若不是0,s2[j1+1] != s2[i1] [^1]
		if (s2[j1+1] == s2[i1])   j1++;
		nextt[i1] = j1;
	}
}
void judge(int l, int ll) {
	int j2 = 0;
	getnextt(l);
	for (int i2 = 1; i2 <= ll; i2++) {  //跟文本串比较的话就从s2【1】和s1【1】比较了,故i2从1开始 
		while (j2 && s1[i2] != s2[j2+1]) j2 = nextt[j2];
		if (s1[i2] == s2[j2+1])  j2++;
		if (j2 == l) {
			cout << (i2-l+1) << "\n" ;
			j2 = nextt[j2];
		}
	}
}


[^1]在这里插入图片描述

话说先说句题外话,一个字符串如果输入的时候不想第一个字符输在s【0】里面的话,可以用cin>>s+1;好家伙?我以前居然不知道?
明天搞搞马拉车的回文串问题
睡觉睡觉,狗命要紧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值