zoukankan      html  css  js  c++  java
  • kmp的练习们

    //poj3461 Oulipo
    //kmp模板 统计子串在母串中的位置 
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    int next[100010];
    char p[10010],s[1000010];
    int t,num,l1,l2;
    
    void get_next()
    {
        int j=0;
        int k=-1;
        next[0]=-1;
        while(j<l2)
        {
            if(k==-1||p[k]==p[j])
            {
                k++;
                j++;
                next[j]=k;
            }
            else
            {
                k=next[k];
            }
        }
    }
    
    int kmp()
    {
        int i=0;
        int j=0;
        get_next();
        while(i<l1)
        {
            if(j==-1||p[j]==s[i])
            {
                j++;
                i++;
            }
            else 
            {
                j=next[j];
            }
            if(j==l2) 
            {
                num++;
                j=next[j];
            }
        }
        return num;
    }
    
    int main()
    {
        cin>>t;
        while(t--)
        {
            num=0;
            cin>>p>>s;    
            l1=strlen(s);
            l2=strlen(p);
            cout<<kmp()<<endl;        
        }
    }
    //洛谷3375 字符串匹配 
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    int next[1000101];
    string p,s;
    
    void get_next(string p)
    {
        next[0]=-1;
        int j=0;
        int k=-1;
        int l=p.length();
        while(j<l)
        {
            if(k==-1||p[j]==p[k])
            {
                j++;
                k++;
                next[j]=k;
            }
            else
            {
                k=next[k];
            }
        }
    }
    
    void kmp(string s,string p)
    {
        get_next(p);
        int i=0,j=0;
        int l=s.length();
        while(i<l)
        {
            if(j==-1||p[j]==s[i])
            {
              i++;
              j++;
            }
            else
            {
                j=next[j];
            }
            if(j==p.length()) 
            {
                printf("%d
    ",i-p.length()+1);
                j=0,i--;
            }
        }
        for(int a=1;a<=p.length();a++)
        {
            cout<<next[a]<<" ";
        }
        return;
    }
    
    int main()
    {
        cin>>s>>p;
        kmp(s,p);
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    79. 滑动窗口的最大值
    78. 左旋转字符串
    77. 翻转单词顺序
    76. 和为S的连续正数序列
    75. 和为S的两个数字
    innodb 锁机制
    MVCC
    linux查看状态命令
    design pattern 资料整理
    mysql资料汇总
  • 原文地址:https://www.cnblogs.com/L-Memory/p/6285626.html
Copyright © 2011-2022 走看看