KMP--路过
HDU 1358:弄清楚了NEXT,就好解决,还有不要再循环中用strlen;会超
----------------------我是凑字数的------------------还是不会KMP-------------------------------
HDU: 1711,模板题把,可惜还是不是很理解。
再来一发matrix67的KMP算法解释:召唤门:http://www.matrix67.com/blog/archives/115
一个模板:#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define N 1000005
int next[N],a[N],b[N];
int n,m;
void kmp()
{
next[0]=-1;
int k=-1;
int i=0;
while (i<m)
{
if (k==-1||b[k]==b[i])
{
i++,k++;
next[i]=k;
// printf("%d ",k);
}
else k=next[k];
}
for (int i=0;i<=m;i++) printf("%d ",next[i]);
}
int getkmp()
{
int k=0,i=0;
if (n<m) return -1;
while (i<n&&k<m)
{
if (k==-1||a[i]==b[k])
{
k++,i++;
if (k==m) return i-m+1;
}
else k=next[k];
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) scanf("%d",&a[i]);
for (int i=0;i<m;i++) scanf("%d",&b[i]);
memset(next,0,sizeof(next));
kmp();
// for (int i=0;i<=m;i++) printf("%d ",next[i]);
// printf("%d\n",getkmp());
}
return 0;
#include<math.h>
#include<algorithm>
using namespace std;
#define N 1000005
int next[N],a[N],b[N];
int n,m;
void kmp()
{
next[0]=-1;
int k=-1;
int i=0;
while (i<m)
{
if (k==-1||b[k]==b[i])
{
i++,k++;
next[i]=k;
// printf("%d ",k);
}
else k=next[k];
}
for (int i=0;i<=m;i++) printf("%d ",next[i]);
}
int getkmp()
{
int k=0,i=0;
if (n<m) return -1;
while (i<n&&k<m)
{
if (k==-1||a[i]==b[k])
{
k++,i++;
if (k==m) return i-m+1;
}
else k=next[k];
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) scanf("%d",&a[i]);
for (int i=0;i<m;i++) scanf("%d",&b[i]);
memset(next,0,sizeof(next));
kmp();
// for (int i=0;i<=m;i++) printf("%d ",next[i]);
// printf("%d\n",getkmp());
}
return 0;
}
这题的HASH做法很神奇:挑战程序设计那本书真的很棒,^^///,滚动哈希真的不会有冲突吗?
随性Code