您的位置:首页 > 其它

HDU_1711

2015-11-25 00:18 405 查看
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN = 1000000+10;
const int MAXN1 = 10000+10;

int a[MAXN], b[MAXN1];
int _next[MAXN];

void kmp_next(int* x, int m, int _next[]){  //dp求next数组
int i, k = _next[0] = -1;
i = 0;
while(i<m){
if(k==-1 || x[i]==x[k]) _next[++i] = ++k;
else
k = _next[k];
}
}
int kmpSearch(int* s, int* p ,int slen, int plen){
int i = 0, j = 0;
while(i < slen && j < plen) {
if(j == -1 || s[i] == p[j]) {
++i; ++j;
}
else
j = _next[j];
}
if(j == plen) return i-j;
else return -1;
}

int main(){
int T;
cin >> T;
while(T--){
int la, lb;
scanf("%d%d", &la, &lb);
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for(int i = 0; i < la; i++) scanf("%d", &a[i]);
for(int i = 0; i < lb; i++) scanf("%d", &b[i]);
memset(_next, 0, sizeof(_next));
kmp_next(b, lb, _next);
int pos = kmpSearch(a, b, la, lb);
if(pos!=-1) pos += 1;
cout << pos << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: