HDU 2087 剪花布条 //简单kmp

剪花布条

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8296    Accepted Submission(s): 5415


Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
 

Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
 

Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
 

Sample Input
   
   
   
   
abcde a3 aaaaaa aa #
 

Sample Output
   
   
   
   
0 3
 

Author
qianneng
 

Source
冬练三九之二
 

Recommend
lcy   |   We have carefully selected several similar problems for you:   3746  3336  1358  2091  2094 
#include <stdio.h>

char ch1[1100], ch2[1100];
int next[1100];

void getnext()
{
	int i, j;
	i = 0;
	j = -1;
	next[0] = -1;
	while(ch2[i])
	{
		if(j==-1 || ch2[i]==ch2[j])
		{
			i++;
			j++;
			next[i] = j;
		}
		else
			j = next[j];
	}
}
int kmp()
{
	int i, j;
	int count;
	i = 0;
	j = 0;
	count = 0;
	while(ch1[i])
	{
		if(j==-1 || ch1[i]==ch2[j])
		{
			i++;
			j++;
			if(ch2[j] == 0)
			{
				count++;
				j = 0;
			}
		}
		else
			j = next[j];
	}
	return count;
}

int main()
{
	int count;
	while(1)
	{
		scanf("%s", ch1);
		if(ch1[0]=='#')		break;
		scanf("%s", ch2);

		getnext();
		count = kmp();

		printf("%d\n", count);
	}

	return 0;
}


你可能感兴趣的:(KMP)