剪花布條(kmp基礎變形)

韓小妹發表於2018-08-11

題目描述

一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中儘可能剪出幾塊小飾條來呢?

輸入

輸入中含有一些資料,分別是成對出現的花布條和小飾條,其布條都是用可見ASCII字元表示的,可見的ASCII字元有多少個,布條的花紋也有多少種花樣。花紋條和小飾條不會超過1000個字元長。如果遇見#字元,則不再進行工作。

輸出

輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。

樣例輸入

abcde a3 
aaaaaa aa 
#

樣例輸出


3

AC碼:

/*KMP演算法*/
#include<stdio.h>
#include<string.h>
const int maxn=1005;
int m,n,nxt[maxn];
char s[maxn],t[maxn];//s[]為模式串,t[]為匹配串 

void getnext()
{
	nxt[0]=0;
	for(int i=1;i<n;i++)
	{
		int j=nxt[i-1];
		while(t[j]!=t[i]&&j>0)
		{
			j=nxt[j-1];
		}
		if(t[j]==t[i])
		nxt[i]=j+1;
		else nxt[i]=0;
	}
}

int kmp()
{
	int j=0;
	int ans=0;
	for(int i=0;i<m;i++)
	{
		while(t[j]!=s[i]&&j>0)
		j=nxt[j-1];
		if(t[j]==s[i]) j++;
		if(j>=n)
		{
			ans++;
			j=0;
		}
	}
	return ans;
}
int main()
{
	while(~scanf("%s",s))
	{
		if(s[0]=='#')
		break;
		scanf("%s",t);
		m=strlen(s);
		n=strlen(t);
		getnext();
		printf("%d\n",kmp());
	}
	return 0;
}

 

相關文章