hdu-1711(kmp)
题意:给你两串数字,问你第二串数字第一次出现在第一串数字的位置,没有输出-1;
解题思路:其是就是字符串匹配,就是这里是数字匹配,把char数组改成int型就可以了;
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #define M 10050 #define N 1005000 using namespace std; int next1[M]; int s[N]; int t[M]; int slen,tlen; void get_next() { int j,k; k=-1;j=0;next1[0]=-1; while(j<tlen) { if(k==-1||t[k]==t[j]) { next1[++j]=++k; } else k=next1[k]; } } int kmp_pos() { int i,j; i=0;j=0; get_next(); while(i<slen&&j<tlen) { if(j==-1||s[i]==t[j]) { i++;j++; } else j=next1[j]; } if(j==tlen) return i-tlen+1; return -1; } int main() { int tt; scanf("%d",&tt); while(tt--) { scanf("%d%d",&slen,&tlen); for(int i=0;i<slen;i++) scanf("%d",&s[i]); for(int j=0;j<tlen;j++) scanf("%d",&t[j]); printf("%d\n",kmp_pos()); } }