HDU

来源:互联网 发布:最新域名升级 编辑:程序博客网 时间:2024/06/06 05:54

感谢出题小哥,复习一下KMP

KMP 入门


#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 1e6 + 7, maxd = 1e4 + 7, mod = 1e9 + 7;const ll INF = 0x7f7f7f7f;int n, m, flag;int t[maxn], s[maxd];int f[maxd];void init() {    scanf("%d %d", &n, &m);    for(int i = 0; i < n; ++i)        scanf("%d", &t[i]);    for(int i = 0; i < m; ++i)        scanf("%d", &s[i]);    f[0] = f[1] = 0;    for(int i = 1; i < m; ++i) {        int j = f[i];        while( j && s[i] != s[j]) j = f[j];        f[i+1] = ( s[i] == s[j] ? j+1 : 0);    }}void solve() {    int j = 0;    for(int i = 0; i < n; ++i) {        while(j && s[j] != t[i]) j = f[j];        if(s[j] == t[i]) ++j;        if(j == m) { flag = 1; cout << i-m+2 << endl; return; }    }}int main() {    int T;    scanf("%d", &T);    while(T--) {        init();        flag = 0;        solve();        if(!flag) cout << -1 << endl;    }    return 0;}


原创粉丝点击