HDU 2087 剪花布条【在字符串中不可重叠地寻找子串数量】

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

Input输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。 
Output输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。 
Sample Input

abcde a3
aaaaaa  aa
#

Sample Output

0
3

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 1000 + 10
using namespace std;

char a[MAX], b[MAX];
int p = 0;

int main()
{
    while ( scanf("%s", a), a[0] != ‘#‘) {
        getchar();
        scanf("%s", b);
        getchar();
        int ans = 0;
        char *pa = a, *pb = b;

        while ( strstr( pa, pb)) {
            ans ++;
            pa = strstr( pa, pb);
            if ( strlen( pa) == strlen( pb)) {
                break;
            }
            pa += strlen( pb);
        }
        printf("%d\n", ans);
    }

    return 0;
}

库函数strstr的运用

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define M 10010
#define N 1000010
char s1[M],s2[N];
int next1[N];
int sum;
void Nextll(int len2)
{
   int i=-1,j=0;
   next1[0]=-1;
   while(j<len2)
    {
       if(i==-1||s2[i]==s2[j])
       {
           ++i;
           ++j;
           next1[j]=i;
       }
       else
           i=next1[i];
    }
}
void Kmp(int len1,int len2)
{
   int i=0,j=0;
   sum=0;
   while(j<len1)
    {
       if(i==-1||s1[j]==s2[i])
       {
           ++i;
           ++j;
       }
       else
           i=next1[i];
       if(i==len2)
       {
           sum++;
           i=next1[i];
       }
    }
}
int main()
{
   while(~scanf("%s%s",s1,s2))
    {
        if((strcmp(s1,"#")==0)||(strcmp(s2,"#")==0))
                 break;
       int len1=strlen(s1);
       int len2=strlen(s2);
       Nextll(len1);
       Kmp(len1,len2);
       printf("%d\n",sum);
    }
   return 0;
}

kmp

时间: 2024-10-05 06:05:25

HDU 2087 剪花布条【在字符串中不可重叠地寻找子串数量】的相关文章

HDU - 2087 剪花布条 (KMP)

Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样.花纹条和小饰条不会超过1000个字符长.如果遇见#字符,则不再进行工作. Output 输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间

(KMP 1.3)hdu 2087 剪花布条(求文本串中有几个模式串)

题目: 剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10380    Accepted Submission(s): 6684 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输

HDU 2087 剪花布条(模式串在主串中出现的次数主串中子串不可重叠)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 题意:求模式串在主串中出现的次数,与模式串匹配的子串之间不可重叠. 思路:用kmp算法解决,在匹配更新结果后,重新定位模式串时,不可用j = next[j],应该直接让j定位到模式串开头. code: 1 #include <cstdio> 2 #include <cstring> 3 4 const int MAXN = 1005; 5 6 char aa[MAXN]; 7 c

hdu2087 剪花布条 暴力/KMP

在字符串中不可重叠地寻找子串数量,暴力/KMP 1 #include<stdio.h> 2 #include<string.h> 3 4 int main(){ 5 char a[1005],b[1005]; 6 while(scanf("%s",a)!=EOF&&a[0]!='#'){ 7 scanf("%s",b); 8 getchar(); 9 int la=strlen(a),lb=strlen(b); 10 int

HDU 2087 剪花布条 KMP题解

KMP的应用,不过查找的时候注意一点就够了:查找到一个子串的时候,直接跳过整个串,而不是使用next数组前跳,因为根据题意需要剪出小饰条,小饰条之间不能重叠. const int MAX_N = 1001; char txt[MAX_N], pat[MAX_N]; int next[MAX_N], len; void genNext() { for (int i = 1, j = 0; i < len; ) { if (pat[i] == pat[j]) next[i++] = ++j; els

HDU 3518 Boring counting(后缀数组啊 求字符串中不重叠的重复出现至少两次的子串的个数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3518 Problem Description 035 now faced a tough problem,his english teacher gives him a string,which consists with n lower case letter,he must figure out how many substrings appear at least twice,moreover

字符串中连续出现最多的子串 &amp; 字符串中最长重复子串

字符串中连续出现最多的子串 & 字符串中最长重复子串 字符串中连续出现最多的子串 & 字符串中最长重复子串,这两个问题都可以用后缀数组来表示,至于后缀数组可以参考编程珠玑P156:后缀数组就是定义一个数组指针,分别指向字符串中的对应位置,如下: a b c a b c a b c d e .substr[0] b c a b c a b c d e ....substr[1] c a b c a b c d e .......substr[2] a b c a b c d e ......

字符串中连续出现最多的子串 &amp;amp; 字符串中最长反复子串

字符串中连续出现最多的子串 & 字符串中最长反复子串 字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156:后缀数组就是定义一个数组指针,分别指向字符串中的相应位置,例如以下: a b c a b c a b c d e .substr[0] b c a b c a b c d e ....substr[1] c a b c a b c d e .......substr[2] a b c a b c d e ....

求一个字符串中连续出现最多的子串次数

时间:2014.09.12 地点:基地 心情:明天就要和欧阳去武汉面试阿里了,整理一下同学求助的一道题,写下这一篇,愿一切顺利. 一.题目: 求一个字符串中连续出现最多的子串次数:例如字符串abcbcbcabc,连续出现次数最多的子串是bc,出现次数为3. 二.分析 方法:后缀思路 比如题目中举例中的字符串,它的后缀有: abcbcbcabc  0 bcbcbcabc  1 cbcbcabc  2 bcbcabc  3 cbcabc  4 bcabc  5 cabc  6 abc  7 bc