• 【kmp】剪花布条


    问题 K: 【KMP】剪花布条

    题目描述

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

    输入

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

    输出

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

    样例输入

    abcde a3
    aaaaaa  aa
    #
    

    样例输出

    0
    3

    【题解】

    裸的kmp题目。。。

    1、对于匹配串进行get_Next()

    2、对于文本串用匹配串Next数组快速匹配,注意加入匹配后的操作语句。

    【代码】:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N = 1e3+10;
     4 char s[N],p[N];
     5 int Next[N],n,m,ans;
     6 void get_Next(){
     7     Next[0] = 0 ;
     8     for(int i=2,j=0 ; i<=m ;i++){
     9         while( j && p[i] != p[j+1] ) j = Next[j] ;
    10         if( p[i] == p[j+1] ) j++;
    11         Next[i] = j ;
    12     }
    13 }
    14 void KMP(){
    15     ans = 0 ;
    16     for(int i=1,j=0;i<=n;i++){
    17         while( j && s[i] != p[j+1] ) j = Next[j] ;
    18         if( s[i] == p[j+1] ) j++;
    19         if( j==m ){
    20             j = 0;
    21             ans ++;
    22         }
    23     }
    24     printf("%d
    ",ans);
    25 }
    26 int main()
    27 {
    28     while( scanf("%s",s+1) ,strcmp(s+1,"#") ){
    29         scanf("%s",p+1);
    30         n = strlen( s+1 ) , m = strlen( p+1 );
    31         get_Next();
    32         KMP();
    33     }
    34     return 0 ;
    35 }
    View Code
  • 相关阅读:
    前端之HTML
    面向对象编程思想
    【统计】Causal Inference
    Python 最常见的 170 道面试题全解析:2019 版
    面试mysql表设计要注意啥
    数据分析资料汇总
    【crunch bang】论坛tint2配置讨论贴
    【crunch bang】增加壁纸图片文件
    【linux】xx is not in the sudoers file 解决办法
    【crunch bang】安装firefox,删除iceweasel
  • 原文地址:https://www.cnblogs.com/Osea/p/11333507.html
Copyright © 2020-2023  润新知