1. 程式人生 > >【hdu1711】 Number Sequence

【hdu1711】 Number Sequence

init 一段 mem for urn hdu include mes kmp

雖然noip很少有單獨把一些關於字符串的算法拉出來考,但是一定的練習也是必要的23333333333,至少要把板子打一遍吧2333333333333

這個題是一個裸到不能再裸的kmp,算是開始?233333

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int ne[10010],n,m,t,ans;
int a[1000010],b[10010];
inline void init()
{
    int j=0;//j是指當前在匹配串的第幾位,預處理next數組實際上很像next數組自己進行匹配 
for(int i=2;i<=m;i++)//i是指當前在被匹配串的第幾位 { while(j&&b[i]!=b[j+1])//如果當前這一位 j=ne[j];//向前面的與這一段匹配的子串跳轉而去 if(b[i]==b[j+1])//如果當前這一位匹配 j++;//j就標記在這裏 ne[i]=j;//當前這位的next就記錄為j } } //kmp算法實際上是記錄了之前的匹配信息,在這個基礎上進行下一步匹配,感覺和記憶化搜索有點像233333 inline void
kmp()//和剛才預處理類似 { int j=0;ans=0;//多加了個ans for(int i=1;i<=n;i++) { while(j&&b[j+1]!=a[i])//這裏a成了被匹配串 j=ne[j]; if(a[i]==b[j+1]) j++; if(j==m)//因為這個題說找到最小的一個k,所以在這裏停下 { ans=i-j+1;return; } } }
int main() { scanf("%d",&t); while(t--) { memset(ne,0,sizeof(ne)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) scanf("%d",&b[i]); init();//預處理 kmp(); if(ans>0) printf("%d\n",ans); else printf("-1\n"); } }

【hdu1711】 Number Sequence