• 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;
    }
  • 相关阅读:
    Mybatis使用map传递参数与模糊查询写法
    mybatis实现简单的crud
    普通maven项目导入mybatis依赖后找不到程序包(已解决)
    MarkDown语法学习
    CentOS 7 配置hadoop(一) 安装虚拟机(伪分布)
    CentOS 7 配置hadoop(二) 配置hdfs(伪分布)
    生成32个的字母加数字
    mysql 横变竖 竖变横
    Java实现短息验证
    spring+springmvc+mybatis+Redis的配置文件
  • 原文地址:https://www.cnblogs.com/shidianshixuan/p/13463728.html
Copyright © 2020-2023  润新知