• 剪花布条 HDU


    #define  _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    
    #include<algorithm>
    #include<string>
    #include<cstdio>
    #include<cmath>
    #include<stack>
    #include<cstring>
    #include<functional>
    #include<queue>
    #include<set>
    #include<map>
    #define LL long long
    #define lp(s,i,n) for(int i = s;i < n;i++)
    #define lpd(s,i,n) for(int i = s;i <= n;i++)
    #define clr(a,b) memset(a,b,sizeof(a))
    #define scn(a)  scanf("%I64d",&a)
    #define prf(a)  printf("%d
    ",a)
    using namespace std;
    const int N = 100020;
    const int MAXE = 20020;
    
    const int INF = 0x3f3f3f3f;
    const double pi = 2 * asin(1);
    int cnt,pp;
    int n, m;
    int a[1000020], b[1000020];
    int nex[1000020];
    void get_next(string p, int *x)
    {
        int i, j;
        i = 0;
        j = -1; 
        nex[0] = -1;
        while (i < p.size())
        {
            if (j == -1 || p[i] == p[j])
            {
                i++;
                j++;
                //next[i] = j;
    
                if (p[i] != p[j])
                    nex[i] = j;
                else
                    nex[i] = nex[j];
    
                //cout << "next[i] = " << j << endl;
            }
            else
            {
                j = nex[j];
                //cout << "i = " << i << " j = " << j << endl;
            }
        }
    }
    
    int index_kmp(string p, string x)
    {
        int i = -1;
        int j = -1;
        int len1 = p.size();
        int len2= x.size();
        
        get_next(x, nex);
        while (i < len1 && j < len2)
        {
            if (j == -1 || p[i] == x[j])
            {
                i++;
                j++;
            }
            else
            {
                j = nex[j];
                //cout << "i = " << i << " j = " << j << endl;
            }
            if (j == len2)
            {
                cnt++;
                
                j =0;
    
            }
        }
        return cnt;
        
    }
    
    
    
    
    
    
    
    int main(void)
    {
        int t;
        
        string a, b;
        
        while (cin>>a)
        {
            if (a[0] == '#')break;
            cnt = 0;
            cin >> b;
            //cin >> n >> m;
            //cin >> b >> a;
            int ans = index_kmp(a, b);
            cout << ans << endl;
        }
    
        system("pause");
    
    }
  • 相关阅读:
    NHibernate 转载
    net中Json对单引号和特殊字符串的处理
    C#过滤非法字符
    Linq Distinct 扩展
    (转)Windows启动过程分析预引导
    special content filetypes require specialized software to use
    存储器
    (转)MAPISendMail调用系统默认的邮件客户端发邮件
    FrameControllerModel
    (转)c++的四种类型转换
  • 原文地址:https://www.cnblogs.com/NWUACM/p/6744383.html
Copyright © 2020-2023  润新知