hdu 1711 Number Sequence(KMP)

题目链接:hdu 1711 Number Sequence


题目大意:给出两个序列,问说第二个序列是否能在第一个序列中找到匹配的子序列,可以的话输出第一个匹配序列的第一个位置,否则输出-1


解题思路:KMP,将序列看成是一个字符串,然后找到一个匹配的跳出即可,如果都没有找到的话输出-1.


#include <stdio.h>
#include <string.h>

const int N = 1000005;

int n, m, a[N], b[N], next[N], i;

void init () {
    scanf("%d%d", &n, &m);
    for (i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for (i = 1; i <= m; i++)
        scanf("%d", &b[i]);

    int p = 0;
    for (i = 2; i <= m; i++) {
        while (p > 0 && b[p+1] != b[i])
            p = next[p];
        
        if (b[p+1] == b[i])
            p++;
        next[i] = p;
    }
}

int KMP () {

    int p = 0;
    for (i = 1; i <= n; i++) {
        while (p > 0 && b[p+1] != a[i])
            p = next[p];

        if (b[p+1] == a[i])
            p++;

        if (p == m) {
            return i - m + 1;
        }
    }
    return -1;
}

int main () {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        init ();
        printf("%d\n", KMP());
    }
    return 0;
}


你可能感兴趣的:(hdu 1711 Number Sequence(KMP))