zoukankan      html  css  js  c++  java
  • hdu2087kmp

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

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

    abcde a3
    aaaaaa  aa
    #

    Sample Output

    0
    3
    题意:找两个字符串的最大匹配数
    题解:用kmp每次把父串减去前面已经匹配好的,当无匹配时就直接退出
    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=1000+5,maxn=10000+5,inf=0x3f3f3f3f;
    
    int Next[N],slen,plen;
    string str,ptr;
    
    void getnext()
    {
        int k=-1;
        Next[0]=-1;
        for(int i=1;i<=slen-1;i++)
        {
            while(k>-1&&str[k+1]!=str[i])k=Next[k];
            if(str[k+1]==str[i])k++;
            Next[i]=k;
        }
    }
    int kmp()
    {
        int k=-1;
        for(int i=0;i<=plen-1;i++)
        {
            while(k>-1&&str[k+1]!=ptr[i])k=Next[k];
            if(str[k+1]==ptr[i])k++;
            if(k==slen-1)return i-slen+1;
        }
        return -1;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
     //   cout<<setiosflags(ios::fixed)<<setprecision(2);
        while(1){
            cin>>ptr;
            if(ptr=="#")break;
            cin>>str;
            slen=str.size();
            plen=ptr.size();
            getnext();
            int res=0;
            while(plen>=slen){
                int ans=kmp()+1;
                if(ans==0)break;
                res++;
                ptr=ptr.substr(ans+slen-1,plen);
                plen=ptr.size();
            }
            cout<<res<<endl;
        }
        return 0;
    }
    View Code

     第二个方法感觉更好,直接用kmp的特点直接跳到下一个匹配串

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=1000+5,maxn=10000+5,inf=0x3f3f3f3f;
    
    int Next[N],slen,plen,res;
    string str,ptr;
    
    void getnext()
    {
        int k=-1;
        Next[0]=-1;
        for(int i=1;i<=slen-1;i++)
        {
            while(k>-1&&str[k+1]!=str[i])k=Next[k];
            if(str[k+1]==str[i])k++;
            Next[i]=k;
        }
    }
    void kmp()
    {
        int k=-1;
        for(int i=0;i<=plen-1;i++)
        {
            while(k>-1&&str[k+1]!=ptr[i])k=Next[k];
            if(str[k+1]==ptr[i])k++;
            if(k==slen-1)
            {
                k=-1;
                res++;
            }
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
     //   cout<<setiosflags(ios::fixed)<<setprecision(2);
        while(1){
            cin>>ptr;
            if(ptr=="#")break;
            cin>>str;
            slen=str.size();
            plen=ptr.size();
            getnext();
            res=0;
            kmp();
            cout<<res<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    还在使用golang 的map 做Json编码么?
    Golang 性能测试(2) 性能分析
    golang 性能测试 (1) 基准性能测试
    消息队列 NSQ 源码学习笔记 (五)
    消息队列 NSQ 源码学习笔记 (四)
    消息队列 NSQ 源码学习笔记 (三)
    消息队列 NSQ 源码学习笔记 (二)
    消息队列 NSQ 源码学习笔记 (一)
    你不知道的空格
    Supervisor 使用和进阶4 (Event 的使用)
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/6807306.html
Copyright © 2011-2022 走看看