KMP算法模板 求子串和模板串首先匹配的位置

 1  #include <cstdio>
 2  using namespace std;
 3
 4  const int MAXN = 1e6 + 10;
 5  int nex[MAXN];
 6  int s[MAXN], t[MAXN];
 7
 8  void get_nex(int lm)    {
 9      int i = 0, j = -1;   nex[0] = -1;
10      while (i < lm)  {
11          if (j == -1 || t[j] == t[i]) {
12              i++;    j++;    nex[i] = j;
13          }
14          else    j = nex[j];
15      }
16  }
17
18  int KMP(int ln, int lm)   {
19      get_nex (lm);
20      int i = 0, j = 0;
21      while (i < ln)  {
22          while (j != -1 && s[i] != t[j]) j = nex[j];
23          i++;    j++;
24          if (j == lm) return (i - j + 1);
25      }
26      return -1;
27  }
28
29  int main()    {
30      int T;
31     scanf ("%d", &T);
32      while (T--)   {
33          int ln, lm; scanf ("%d%d", &ln, &lm);
34          for (int i=0; i<ln; ++i)   scanf ("%d", &s[i]);
35          for (int i=0; i<lm; ++i)   scanf ("%d", &t[i]);
36          printf ("%d\n", KMP (ln, lm));
37      }
38
39      return 0;
40  }
时间: 2024-08-05 22:38:44

KMP算法模板 求子串和模板串首先匹配的位置的相关文章

KMP算法中求next数组的实质

在串匹配模式中,KMP算法较蛮力法是高效的算法,我觉得其中最重要的一点就是求next数组: 看了很多资料才弄明白求next数组是怎么求的,我发现我的忘性真的比记性大很多,每次看到KMP算法求next数组都得花很长时间去看怎么求,虽然看了很多遍了,但还是容易忘,所以我今天非得把它记下来,这样我下次看到的时候就可以直接看我的总结了,哈,可恶的记性,总是这么不争气.设目标串为S,需要匹配串为T: next[j]数组生成的实质:     next[j]数组的值其实就等于串T1T2...Tj-1中相同的前

KMP算法学习记录----《大话数据结构》部分匹配表学习部分

如需转载,请保留本文链接. 首先先将<大话数据结构>关于KMP算法的讲解部分贴上,本文不提供下载链接,也不会将电子书作为资料留百度云,需要电子书的各位,请自行寻找电子版. 关于上述的KMP算法种的next数组的推导部分,一直不是很明白,本贴是关于上述部分的学习推导记录. 以书中字符串为例: 1|2|3|4|5|6|7|8|9| a|b|a|b|a|a|a|b|a| 0|1|1|2|3|4|2|2|3| string T = "ababaaaba"; int i = 1;j

KMP模版 &amp;&amp; KMP求子串在主串出现的次数模版

int next[MAX_LEN]; void creat_next(char *S, int Sn) { int k, q; next[0] = 0; for(k=0, q=1; q<Sn; q++){ while(k>0 && S[k]!=S[q]) k = next[k-1]; if(S[k] == S[q]){ k++; } next[q] = k; } } bool Judge(char *S, char *T, int Sn, int Tn)//S是子串,T是主串

poj 2406 Power Strings求子串在主串中最多叠加次数

#include<stdio.h> #define M 1000010 int n,next[M]; char s[M]; void getNext() { int i=1,j=-1; next[0]=-1; for(;s[i];i++){ while(j!=-1&&s[j+1]!=s[i])j=next[j]; if(s[j+1]==s[i])j++; next[i]=j; } n=i; } int main() { while(scanf("%s",s)

详讲KMP算法

两个字符串: 模式串:ababcaba 文本串:ababcabcbababcabacaba KMP算法作用:快速在文本串中匹配到模式串 如果是穷举法的方式: 大家有发现,这样比效率很低的. 所以就需要使用一种高效率模式的算法:KMP算法. 大家有看到上面的穷举法,是一位一位的挪.那可以一次挪多位不就行了.像下面: 那么为什么可以这样挪呢?  模式串向右移动的距离 = 已匹配字符数 - 失配字符的上一位字符所对应的最大长度值 那么我们要怎么找出每位上的最大长度值呢呢?   我们来找一下. 所以,使

[模板]KMP算法

昨天晚上一直在调KMP(模板传送门),因为先学了hash[关于hash的内容会在随后进行更(gu)新(gu)]于是想从1开始读...结果写出来之后一直死循环,最后我还是改回从0读入字符串了. [预先定义被匹配文本串为s1,长度为m:匹配模式串为s2,长度为n] KMP算法在字符串匹配算法中时间复杂度比较优,可以做到在O(m+n)的时间内匹配,相对于无脑暴力匹配的O(m*n)复杂度而言要优很多. KMP算法的思路比较简单,即在匹配前对字符串进行预处理,用空间换时间,通过处理next数组来实现在部分

kmp算法模板及理解

kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式串用next数组进行跳转到符合的位置,而目标串不需要再往回匹配,为什么是最长的相同的前缀后后缀呢? 因为只有这样才能一边避免可能漏掉的位置,一边尽量不重复已经匹配的位置; getNext的函数: void getNext() { int k = -1,j = 0,len = strlen(str);

KMP小扩展,找出子串在主串中出现的所有位置

KMP算法能够高效地匹配字符串,找出子串(T串)在主串(S串)中出现的首个位置的原算法网上已经有很多优秀的博文进行详细讲解,这里就不多赘述. 这篇博文主要是对KMP原算法稍作改动,使其能够在主串中把所有匹配的主串找出来. 找出首个匹配的算法好弄,next数组求出来后直接用来匹配,直到出现完全匹配的情况的时候就停止搜索把答案扔出来就行,但是想把所有T串找出来的话就得完全把S串搜完, 就算已经在S串中找到一个T串后也是不能马上停止搜索的. 难点就在已经完全匹配了一个T串以后怎么继续进行下一个匹配.

HDU 1686 Oulipo【kmp求子串出现的次数】

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, pu