扩展 KMP

#include <cstdio>
#include <cstring>

const int MAXN = 1000005;

namespace ExKmp {
    int next[MAXN], extend[MAXN];

    void getNext(char *str, int n) {
        int i = 0;
        while (str[i] == str[i + 1] && i + 1 < n) i++;
        next[0] = n;
        next[1] = i;
        int pos = 1;
        for (i = 2; i < n; i++) {
            if (next[i - pos] + i < next[pos] + pos) next[i] = next[i - pos];
            else {
                int j = next[pos] + pos - i;
                if (j < 0) j = 0;
                while (i + j < n && str[j] == str[j + i]) ++j;
                next[i] = j;
                pos = i;
            }
        }
    }

    void getExtand(char *s, char *t) {
        int n = strlen(s), m = strlen(t);
        getNext(t, m);
        int i = 0;
        while (s[i] == t[i] && i < m && i < n) i++;
        extend[0] = i;
        int pos = 0;
        for (i = 1; i < n; i++) {
            if (next[i - pos] + i < extend[pos] + pos) extend[i] = next[i - pos];
            else {
                int j = extend[pos] + pos - i;
                if (j < 0) j = 0;
                while (i + j < n && j < m && s[j + i] == t[j]) ++j;
                extend[i] = j;
                pos = i;
            }
        }
    }
}

char s[MAXN], t[MAXN];

int main() {
    scanf("%s %s", s, t);
    ExKmp::getExtand(s, t);

    return 0;
}

results matching ""

    No results matching ""