zoukankan      html  css  js  c++  java
  • P3375 【模板】KMP字符串匹配

     

    题目

    题目链接

    主要算法 :  字符串,字符串KMP算法,字符串模式匹配

     另一篇文章对KMP有详解,此处千言万语省略了哈~~~,详解链接

    直接上代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define FORa(i,s,e) for(int i=s;i<=e;i++)
    #define FORs(i,s,e) for(int i=s;i>=e;i--)
    #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),pa==pb)?EOF:*pa++
    #define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout);
    
    using namespace std;
    static char buf[100000],*pa=buf,*pb=buf;
    inline int read();
    
    const int MAXN=1000000;
    char sta[MAXN+1],stb[MAXN+1];
    int lena,lenb,next[MAXN+1];
    int main()
    {
        scanf("%s%s",sta+1,stb+1);
        lena=strlen(sta+1),lenb=strlen(stb+1);
        int j=0;
        FORa(i,2,lenb)
        {
            while(j&&stb[i]!=stb[j+1]) j=next[j];
            if(stb[i]==stb[j+1]) j++;
            next[i]=j;
        }
        j=0;
        FORa(i,1,lena)
        {
            while(j&&sta[i]!=stb[j+1]) j=next[j];
            if(sta[i]==stb[j+1]) j++;
            if(j==lenb) printf("%d
    ",i-lenb+1),j=next[j];
        }
        FORa(i,1,lenb) printf("%d ",next[i]);
        return 0;
    }
    inline int read()
    {
        register int x(0);register int f(1);register c(gc);
        while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc;
        while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;
        return  x*f;
    }

     总结

     

  • 相关阅读:
    打印乘法口诀
    打印三角形
    java语言基础
    java环境配置
    postgresql新建插入存储过程
    postman做自动化
    fiddler抓包篡改数据实例
    log4j常用4个日志级别
    来一个简单点的表单提交
    mapper文件简单格式
  • 原文地址:https://www.cnblogs.com/SeanOcean/p/11230353.html
Copyright © 2011-2022 走看看