• 扩展kmp模板


    参考博客: https://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html

         http://www.cnblogs.com/Rlemon/archive/2013/06/26/3157574.html

    代码:

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 using namespace std;
     5 
     6 const int MAXN = 1e5 + 10;
     7 char str1[MAXN], str2[MAXN]; //str1为主串,str2为模式串
     8 int exnext[MAXN], extend[MAXN], n, m;
     9 
    10 void get_exnext(void){
    11     exnext[0] = m;
    12     int j = 0, k = 1; //k是使p最大的i
    13     while(j + 1 < m && str2[j] == str2[j + 1]) j++;
    14     exnext[1] = j;
    15     for(int i = 2; i < m; i++){
    16         int p = exnext[k] + k - 1; //p为当前匹配最远的位置
    17         int l = exnext[i - k]; //[k,p]匹配[0,exnext[k]-1],所以[i,p]匹配[i-k,exnext[k]-1],[i-k,i-k+l]匹配[0,l]
    18         if(i + l < p + 1) exnext[i] = l;
    19         else{
    20             j = max(0, p - i + 1);
    21             while(i + j < m && str2[i + j] == str2[j]) j++;
    22             exnext[i] = j;
    23             k = i;
    24         }
    25     }
    26 }
    27 
    28 void ex_kmp(void){
    29     get_exnext();
    30     int j = 0, k = 0;
    31     while(j < n && j < m && str1[j] == str2[j]) j++;
    32     extend[0] = j;
    33     for(int i = 1; i < n; i++){
    34         int p = extend[k] + k - 1;
    35         int l = exnext[i - k];
    36         if(i + l < p + 1) extend[i] = l;
    37         else{
    38             j = max(0, p - i + 1);
    39             while(i + j < n && j < m && str1[i + j] == str2[j]) j++;
    40             extend[i] = j;
    41             k = i;
    42         }
    43     }
    44 }
    45 
    46 int main(void){
    47     scanf("%s%s", str1, str2);
    48     n = strlen(str1);
    49     m = strlen(str2);
    50     ex_kmp();
    51     for(int i = 0; i < m; i++){
    52         cout << exnext[i] << " ";
    53     }
    54     cout << endl;
    55     for(int i = 0; i < n; i++){
    56         cout << extend[i] << " ";
    57     }
    58     cout << endl;
    59     return 0;
    60 }
    View Code
  • 相关阅读:
    物理好题随想
    学案12:电场强度和静电现象
    vscode插件记录
    windows使用总结
    元素周期律 + 元素周期表
    酸碱理论
    氮族元素——磷
    氮族元素——氮
    碱金属元素
    SDN第一次上机实验
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/7351719.html
Copyright © 2020-2023  润新知