洛谷 P3375 【模板】KMP
对于边界问题 , 思考的时候永远构成闭区间 , 如果不是闭区间 , 则通过将操作量指针想成已操作数指针 , 从而解决边界问题
比如kmp中\(s[i] \neq s[j+1]\) , 想着要把\(j\)为已经匹配的最大指针位置 , 从而能自然推导出下一个需要匹配的是\(j+1\)
代码
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
int qwq[N];
int main() {
string s1,s2;
cin>>s1>>s2;
int n1 = s1.size(),n2=s2.size();
s1 = " "+ s1;
s2 = " " + s2;
int j = 0;
for (int i = 2;i <=n2; i++) {
while (j && s2[i] != s2[j+1])
j = qwq[j];
if (s2[i] == s2[j+1])
j++;
qwq[i] = j;
}
j = 0;
for (int i =1; i<= n1; i++) {
while (j && s2[j+1] !=s1[i])
j = qwq[j];
if (s2[j+1] == s1[i])
j++;
if (j==n2) {
cout<<i-j+1<<"\n";
j = qwq[j];
}
}
for (int i = 1; i<= n2; i++)cout<<qwq[i]<<" \n"[i==n2];
return 0;
}

浙公网安备 33010602011771号