之所以今天非要写个博客就是因为我觉得自己拖延症又犯了,立个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;好家伙?我以前居然不知道?
明天搞搞马拉车的回文串问题
睡觉睡觉,狗命要紧