[kmp] doj 1045 Number Sequence

来源:互联网 发布:网络协议大全 pdf 编辑:程序博客网 时间:2024/05/16 15:01
#include <iostream>#include <cstdio>using namespace std;const int N = 1000005;const int M = 10005; int s[N], t[M];int next[M];void get_next(int len) {    int i = 0, j = -1;    next[0] = -1;    while(i < len-1) {        if(j == -1 || t[i] == t[j]) {            ++i, ++j; next[i] = j;        }        else j = next[j];    }}int kmp(int slen, int tlen) {    int i = 0, j = 0;    while(i < slen && j < tlen) {        if(j == -1 || s[i] == t[j]) {            ++i, ++j;        }        else j = next[j];    }    if(j == tlen) return i - j + 1;    else return -1;}int main() {    int T, n, m;    cin >> T;    while(T--) {        cin >> n >> m;        for(int i = 0; i < n; ++i) {            cin >> s[i];        }        for(int i = 0; i < m; ++i) {            cin >> t[i];        }        get_next(m);        cout << kmp(n, m) << endl;    }    return 0;} /**************************************************************    Problem: 1045    User: robby    Language: C++    Result: Accepted    Time:0 ms    Memory:5664 kb****************************************************************/