zoukankan      html  css  js  c++  java
  • HDU-2087 C

    http://acm.hdu.edu.cn/showproblem.php?pid=2087

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

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

    abcde a3
    aaaaaa  aa
    #

    Sample Output

    0
    3

      对于aaaaaa aa这个样例,为:aa  aa   aa 为三个。不可重叠。
      kmp基本的求next数组。代码中,当j==-1时 ,表示匹配完成一段,判断时当j==-1时,i++,跳入下一个匹配段,j=0表示从匹配段的头开始。
      比如对于aaaaaa这个样例:
          aa
          此时i==1,j==1,匹配成功,执行i++,j++ ————>i=2,j=2.由于长度正好为2,则————>i--,j=-1,得i=1,j=-1;
          j=-1,则————>j++,i++————>j=0,i=2。保证了不重叠,使代码简洁无需额外判断,长度正好时,i被多加,则再减回来,再加回去。
          好像有点绕...看代码吧
      代码:
      
    #include<iostream>
    #include<cstring>
    typedef long long ll;
    using namespace std;
    const int maxn=1e5+10;
    char a[maxn],b[maxn];
    int nex[maxn];
    void getnext(int len)
    {
        nex[0]=-1;
        int k=-1;
        int j=0;
        while(j<len)
        {
            if(k==-1||a[j]==a[k])
            {
                ++k;
                ++j;
                nex[j]=k;
            }
            else
                k=nex[k];
        }
        return ;
    }    
    int main()
    {
        while(scanf("%s",a))
        {
            if(a[0]=='#')
                break;
            scanf("%s",b);
            int ans=0;
            int lenb=strlen(b);
            getnext(lenb);
            int lena=strlen(a);
            int i=0,j=0;
            while(i<lena&&j<lenb)
            {
                if(j==-1||a[i]==b[j])
                {    
            //        printf("匹配成功:i=%d  j=%d
    ",i,j);
                      i++;j++;
                    
                }
                else
                {
                    j=nex[j];
                }
                if(j==lenb)
                {
                    ans++;
                    j=-1;                                
                    i--;
                //    printf("i: %d
    ",i);
                }
            }
            cout<<ans<<endl;
        }
    }
  • 相关阅读:
    Direct3D光与材质的颜色值
    Direct中灯光的注意事项
    DirectInput:poll轮询理解
    GetAsyncKeyState函数返回值
    关于PeekMessage中hwnd参数
    VS链接MySql需注意的一些问题(C/C++)
    Windows配置:环境变量是个什么玩意儿?
    项目中ofstream 打开当前文件夹下内容失败原因
    hdoj--2073--无限的路(数学规律)
    hdoj--1205--吃糖果(规律)
  • 原文地址:https://www.cnblogs.com/liyexin/p/11514879.html
Copyright © 2011-2022 走看看