KMP

Luogu - P3375 【模板】KMP字符串匹配

//Luogu P3375 KMP
#include 
#define N 1000006
using namespace std;
char a[N], b[N];
int nxt[N], len_a, len_b, j;
int main() {
     
    scanf("%s", a + 1);
    scanf("%s", b + 1);
    len_a = strlen(a + 1);
    len_b = strlen(b + 1);
    j = 0;
    for (int i = 2; i <= len_b; ++i) {
     
        while(j && b[i] != b[j + 1]) {
     
            j = nxt[j];
        }
        if (b[i] == b[j + 1]) {
     
            ++j;
        }
        nxt[i] = j;
    }
    j = 0;
    for(int i = 1; i <= len_a; ++i) {
     
        while(j && a[i] != b[j + 1]) {
     
            j = nxt[j];
        }
        if(a[i] == b[j + 1]) {
     
            ++j;
        }
        if(j == len_b) {
     
            printf("%d\n", i - j + 1);
            j = nxt[j];
        }
    }
    for (int i = 1; i <= len_b; ++i) {
     
        printf(" %d" + !(i - 1), nxt[i]);
    }
    printf("\n");
    return 0;
}

你可能感兴趣的:(字符串,算法,字符串)