洛谷 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;
}
posted @ 2025-05-10 22:03  Guaninf  阅读(11)  评论(0)    收藏  举报