• hdu2087:剪花布条


    剪花布条

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 28085    Accepted Submission(s): 17143


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

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

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

     Sample Input 

    abcde a3

    aaaaaa aa

    #

     

    Sample Output

    0

       3

    Author
    qianneng
     

    Source
     

    Recommend
    lcy   |   We have carefully selected several similar problems for you:  1711 1686 3746 3336 1358 

    题解:

    把两个串hash一下,然后提取以花布条串中每一位为起点长为len(小饰条长度)的子串的hash判断,注意匹配成功后跳len位,否则跳一位

    #include<bits/stdc++.h>
    #define ui unsigned int
    #define bs 690163
    #define MOD 999983
    using namespace std;
    int len1,len2,ans=0;
    char st1[1005],st2[1005];
    ui hash1[1005],hash2[1005],poww[1005];
    int main()
    {
        poww[0]=1;
        for(int i=1;i<=1001;i++) poww[i]=poww[i-1]*bs;
        while(1)
              {
                    ans=0;
                    scanf("%s",st1); len1=strlen(st1);
                    if(len1==1&&st1[0]=='#') break;
                    scanf("%s",st2); len2=strlen(st2);
                    if(len2>len1) {
                         printf("0
    ");
                     continue;      
                    }
                    hash1[0]=(int)st1[0],hash2[0]=(int)st2[0];
                    for(int i=1;i<len1;i++) hash1[i]=(int)st1[i]+hash1[i-1]*bs;
                    for(int i=1;i<len2;i++) hash2[i]=(int)st2[i]+hash2[i-1]*bs; 
                    for(int i=0;i<=len1-len2;) {
                           int hs;
                         if(i!=0) hs=hash1[i+len2-1]-hash1[i-1]*poww[len2];
                         else hs=hash1[i+len2-1];
                         hs%=MOD;
                         if(hs==hash2[len2-1]%MOD) {
                              ans++;
                              i+=len2;
                              } 
                         else 
                          i++;      
                        }
                    printf("%d
    ",ans);    
              }
        return 0;
    }
    View Code
  • 相关阅读:
    51Nod
    [HDU-5172] 单点查询线段树
    HihoCoder
    CodeForces
    计蒜客-T1271 完美K倍子数组
    [CodeForces-629A 用阶乘会爆掉
    计蒜客-A1139 dfs
    Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version)(Manacher算法+输出回文字符串)
    HDU
    操作系统习题——虚地址转换为内存地址计算
  • 原文地址:https://www.cnblogs.com/nanjolno/p/9357497.html
Copyright © 2020-2023  润新知