zoukankan      html  css  js  c++  java
  • ProblemC 剪花布条(KMP基础)

    C - 剪花布条
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    Description

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

    Input

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

    Output

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

    Sample Input

    abcde a3 aaaaaa aa #
     

    Sample Output

    0 3
     
     

    题目大意:

      就是说,给你一个文本串,给你一个模式串,然后让你求出模式串在文本串中出现了多少次,注意,不能有重叠.
    解题思路:

      把在文本串中找模式串的程序稍微修改下,就A了,把t2=next[t2] 改为0,就好了。

      

    代码:

     1 # include<cstdio>
     2 # include<iostream>
     3 # include<cstring>
     4 
     5 using namespace std;
     6 
     7 # define MAX 1234
     8 
     9 char s1[MAX];
    10 char s2[MAX];
    11 int nxt[MAX];
    12 
    13 void get_nxt()
    14 {
    15     int len = strlen(s2);
    16     int t1 = 0,t2;
    17     t2 = nxt[0] = -1;
    18     while ( t1 < len )
    19     {
    20         if ( t2==-1||s2[t1]==s2[t2] )
    21         {
    22             t1++;t2++;
    23             nxt[t1] = t2;
    24         }
    25         else
    26             t2 = nxt[t2];
    27     }
    28 }
    29 
    30 int kmp()
    31 {
    32     int len1 = strlen(s1), len2 = strlen(s2);
    33     int t1 = 0,t2 = 0;
    34     int times = 0;
    35     while ( t1<len1 )
    36     {
    37         if ( t2==-1||s1[t1]==s2[t2] )
    38         {
    39             t1++;t2++;
    40         }
    41         else
    42             t2 = nxt[t2];
    43         if ( t2==len2 )
    44         {
    45             times+=1;
    46             t2 = 0;
    47         }
    48     }
    49     return times;
    50 }
    51 
    52 int main(void)
    53 {
    54     while ( scanf("%s%s",s1,s2) )
    55     {
    56         if ( s1[0]=='#' )
    57             break;
    58         get_nxt();
    59         int ans = kmp();
    60         printf("%d
    ",ans);
    61     }
    62 
    63     return 0;
    64 }
  • 相关阅读:
    【洛谷P1962】斐波那契数列
    【洛谷P3390】【模板】矩阵快速幂
    【洛谷P3070】[USACO13JAN]岛游记Island Travels
    【NOIp模拟赛】antipalindrome
    【洛谷P3930】SAC E#1
    【洛谷P3928】SAC E#1
    【洛谷P3927】SAC E#1
    【NOIp模拟赛】binary
    【NOIp模拟赛】value
    【洛谷P2341】[HAOI2006]受欢迎的牛
  • 原文地址:https://www.cnblogs.com/wikioibai/p/4540320.html
Copyright © 2011-2022 走看看