• KMP模板


     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 int Next1[1000000];
     5 char a[1000005],b[1000005];
     6 /* P 为模式串,下标从 0 开始 */
     7 void GetNext(string P,int next1[]){
     8     int p_len=P.size();
     9     int i=0;   // P 的下标
    10     int j=-1;
    11     next1[0]=-1;
    12 
    13     while(i<p_len-1){
    14         if (j == -1 || P[i] == P[j]){
    15             i++;
    16             j++;
    17             if(P[i]!=P[j])next1[i]=j;
    18             else next1[i]=next1[j];
    19         }
    20         else
    21             j=next1[j];
    22     }
    23 }
    24 
    25 /* 在 S 中找到 P 第一次出现的位置 */
    26 int KMP(string S,string P,int Next[]){
    27     GetNext(P, Next);
    28     int i=0;  // S 的下标
    29     int j=0;  // P 的下标
    30     int s_len=S.size();
    31     int p_len=P.size();
    32     while (i<s_len&&j<p_len){
    33         if (j==-1||S[i]==P[j]){  // P 的第一个字符不匹配或 S[i] == P[j]
    34             i++;
    35             j++;
    36         }
    37         else
    38             j=Next[j];  // 当前字符匹配失败,进行跳转
    39     }
    40 
    41     if (j==p_len)  // 匹配成功
    42         return i-j;
    43 
    44     return -1;
    45 }
    46 
    47 int main(){
    48     int n,ind;
    49 
    50     cin>>a;
    51     cin>>b;
    52  ind=KMP(a,b,Next1);
    53     if(ind!=-1){
    54         cout<<ind<<'
    ';
    55     }
    56     else cout<<-1<<'
    ';
    57     return 0;
    58 }

    之前的有bug,还好多人抄了这篇博客。。。特此致歉

  • 相关阅读:
    构建之法
    第一阶段SCRUM冲刺
    NABCD项目分析
    结对开发
    梦断代码阅读-04
    梦断代码阅读-05
    移动端疫情展示
    用Python爬取疫情数据
    全球疫情可视化地图
    第二阶段冲刺第三天个人记录
  • 原文地址:https://www.cnblogs.com/Never-Land/p/10821852.html
Copyright © 2020-2023  润新知