• kmp模板


    算法步骤:

    一.求next数组:

    双指针假设从0开始,如果前后一样就让next[j]的值变成已经匹配好的数目i+1。

    如果不一样则前指针不断动归跳已经算出来的next如果能继续匹配就继续,直到如果跳到开头还是和末尾匹配不上就让末尾j++。

    二.主串和模式串匹配:

    双指针一个j指向主串t一个i指向模式串s,如果一样就同时向后,之后有2种情况。

    一种是模式串全部匹配成功,判断条件为i==lens。

    另一种是失配,模式串不断跳next,能继续匹配就继续,跳到开头都匹配不上就主串j++。

    std::function<void(char*,int,int*)> getnext = [&](char* s, int len, int nxt[]) {
      int i = 0, j = 1;
      while (j < len) {
        if (s[i] == s[j]) nxt[j] = i+1,i++,j++;
        else if (i == 0) j++;
        else i = nxt[i-1];
      }
    };
    std::function<void(char*,int,char*,int,int*)> kmp = [&](char* s, int lens, char* t, int lent, int nxt[]) {
      int i = 0, j =0;
      while (j < lent) {
        if (s[i] == t[j]) i++, j++;
        else if (i == 0) j++;
        else i = nxt[i-1];
        if (i == lens) {
          /*do something*/
        }
      }
    };
  • 相关阅读:
    C#不显示在任务栏
    打开文件,文件夹
    C#文本操作
    C#路径2
    C#当前程序路径获取
    HDU 5155 Harry And Magic Box dp
    POJ 1971 Parallelogram Counting
    CodeForces 479C Exams 贪心
    CodeForces 508E Arthur and Brackets 贪心
    CodeForces 483B 二分答案
  • 原文地址:https://www.cnblogs.com/hznudreamer/p/13556539.html
Copyright © 2020-2023  润新知