标签:pac number return inline log mem == enc mp算法
虽然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"); } }
标签:pac number return inline log mem == enc mp算法
原文地址:http://www.cnblogs.com/Loi-dfkdsmbd/p/7709850.html