int kmpnext[MAXLEN];

void makenext (char p[]) {
    int len = (int)strlen(p);
    kmpnext[0] = 0;
    for (int k = 0, i = 1; i < len; i++) {
        while (k > 0 && p[i] != p[k]) {
            k = kmpnext[k - 1];
        }
        if (p[i] == p[k]) {
            k++;
        }
        kmpnext[i] = k;
        //cout << kmpnext[i] << endl;
    }
}

//b串在a串中出现的位置
int main(int argc, const char * argv[]) {
    cin >> a >> b;
    makenext(b);
    int lena = (int)strlen(a);
    int lenb = (int)strlen(b);
    for (int i = 0, j = 0; i < lena; i++) {
        while (j > 0 && a[i] != b[j]) {
            j = kmpnext[j - 1];
        }
        if (a[i] == b[j]) {
            j++;
        }
        if (j == lenb) {
            cout << i - j + 1 << endl;
            break;
            //j = kmpnext[j - 1]; //用于需要寻找多次匹配统计次数的手动回溯
        }
    }
    return 0;
}

results matching ""

    No results matching ""