zoukankan      html  css  js  c++  java
  • [模板]洛谷T3375 KMP字符串匹配

    这东西。。。算是半囫囵吞枣的理解了。。。总之板子背过就好了嘛QwQ~

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<ctime>
     6 #include<cstdlib>
     7 
     8 #include<string>
     9 #include<stack>
    10 #include<queue>
    11 #include<vector>
    12 #include<algorithm>
    13 #include<map>
    14 #include<set>
    15 
    16 #define inf 2147483647
    17 #define ri register int
    18 #define ll long long
    19 
    20 using namespace std;
    21 
    22 inline void read(int &x){
    23     x=0;
    24     char t=getchar();
    25     bool f=0;
    26     
    27     while(t<'0' || t>'9'){
    28         if(t=='-')f=1;
    29         t=getchar();
    30     }
    31     
    32     while(t>='0' && t<='9'){
    33         x=(x<<3)+(x<<1)+t-'0';
    34         t=getchar();
    35     }
    36     
    37     if(f)x=-x;
    38 }
    39 
    40 inline void getnext();
    41 inline void KMP();
    42 
    43 char s1[1000005];
    44 char s2[1000005];
    45 int l1,l2;
    46 
    47 int next[1000005];
    48 
    49 int main(){
    50     scanf("%s",s1+1);
    51     scanf("%s",s2+1);
    52     
    53     l1=strlen(s1+1);
    54     l2=strlen(s2+1);
    55     
    56     getnext();
    57     
    58     KMP();
    59     
    60     for(ri i=1;i<=l2;i++)printf("%d ",next[i]);
    61     
    62     return 0;
    63 }
    64 
    65 inline void getnext(){
    66     int j=0;
    67     next[1]=0;
    68     
    69     for(ri i=2;i<=l2;i++){
    70         while(j && s2[i]!=s2[j+1])j=next[j];
    71         if(s2[i]==s2[j+1])j++;
    72         next[i]=j;
    73     }
    74 }
    75 
    76 inline void KMP(){
    77     int j=0;
    78     
    79     for(ri i=1;i<=l1;i++){
    80         while(j && s1[i]!=s2[j+1])j=next[j];
    81         if(s1[i]==s2[j+1])j++;
    82         
    83         if(j==l2){
    84             printf("%d
    ",i-j+1);
    85             j=next[j];
    86         }
    87     }
    88 }
  • 相关阅读:
    最简单跨平台的日志库
    linux文件锁
    Linux 获取屏幕分辨率与窗口行列数(c/c++)
    linux 信号机制
    记一次函数异常(getopt_long)
    程序单实例运行
    简单地 Makefile 书写
    学习go的一些笔记
    20200930 10. Netty 核心源码剖析
    20200930 9. TCP 粘包和拆包 及解决方案
  • 原文地址:https://www.cnblogs.com/running-coder-wfh/p/7965811.html
Copyright © 2011-2022 走看看