Sicily1282(KMP算法)

注意母串的长度要开大一点。

#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
  int n,m;
  while (scanf("%d",&m)!=EOF)
  {
  	int i;
  	int A[1000000],B[100000];
  	for (i=0;i<=m-1;i++)
  		scanf("%d",&B[i]);
  	scanf("%d",&n);
  	for (i=0;i<=n-1;i++)
  		scanf("%d",&A[i]);

  	int next[100000];
  	int j=0,k=-1;
  	next[0]=-1;
  	while (j!=m)
  	{
  		if (k==-1 || B[j]==B[k])
  		{
  			j++;
  			k++;
  			if (B[j]!=B[k])
  				next[j]=k;
  			else
  				next[j]=next[k];
  		}
  		else
  			k=next[k];
  	}

    j=0;
    int bcount=0;
    while (1)
    {
    	if (j==n)
    	{
    		printf("no solution\n");
    		break;
    	}
    	if (A[j]==B[bcount])
    	{
    		j++;
    		bcount++;
    		if (bcount==m)
    		{
    			printf("%d\n",j-m);
    			break;
    		}
    	}
    	else
    	{
    		if (next[bcount]==-1)
    		{
    			j++;
    			bcount=0;
    		}
    		else if (next[bcount]==0)
    		{
    			bcount=0;
    		}
    		else
    		{
    			bcount=next[bcount];
    		}
    	}
    }
  }
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值