• 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
  • 相关阅读:
    java中Collection 与Collections的区别
    Bridge桥接模式(设计模式11)
    动态代理模式(设计模式10)
    代理模式(静态代理)(设计模式9)
    适配器模式(工厂模式8)
    原型模式(工厂模式7)
    建造者模式(工厂模式6)
    抽象工厂模式(工厂模式5)
    工厂模式(工厂模式4)
    简单工厂模式(工厂模式3)
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/6807306.html
Copyright © 2020-2023  润新知