zoukankan      html  css  js  c++  java
  • hdu2087

    剪花布条

    Problem Description

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

    Input

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

    Output

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

    Sample Input

    abcde a3

    aaaaaa aa

    Sample Output

    0

    3

    经典kmp题,c++里最好不要用next[],这貌似是功能函数,
    int kmp()函数里if...else的else别忘了是j=nnext[j];

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    char s[1100],p[1100];
    int nnext[1100],l1,l2;
    void getnext()
    {
    	int i=0,k=-1;
    	nnext[0]=-1;
    	while(i<l2)
    	{
    		if (k==-1||p[i]==p[k])
    		{
    			i++,k++;
    			nnext[i]=k;
    		}
    		else
    			k=nnext[k];
    	}
    }
    int kmp()
    {
    	getnext();
    	int i=0,j=0,cnt=0;
    	while(i<l1)
    	{
    		if (j==-1||s[i]==p[j])
    		{
    			i++,j++;
    		}
    		else 
    		j=nnext[j];
    		
    		if (j==l2)
    		{
    			j=0; //若两个不同的匹配没有交集则j=0,若存在交集则j=next[j]; 
    			cnt++;
    		}
    	}
    	return cnt;
    }
    int main()
    {
    	int i,j;
    	while(~scanf("%s",s)&&s[0]!='#')
    	{
    		scanf("%s",p);
    		l1=strlen(s),l2=strlen(p);
    		printf("%d
    ",kmp());
    		memset(s,0,sizeof(s));
    		memset(p,0,sizeof(p));
    		memset(nnext,0,sizeof(nnext));
    	}
    	return 0;
    }
  • 相关阅读:
    tomcat部署web服务,验证码刷新不出来
    deployment模板实例
    acme
    私有registry及证书配置
    kubernetes监控
    kubernetes中安装efk
    kubernetes v1.13.1集群
    etcd集群
    centos-src
    比较两三个字段的最大值
  • 原文地址:https://www.cnblogs.com/shidianshixuan/p/13463728.html
Copyright © 2011-2022 走看看