KMP算法模板

不懂的话推荐看这篇博客,讲的很清楚 http://blog.csdn.net/v_july_v/article/details/7041827

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxlen=1024;
 6 char S[maxlen],T[maxlen],next[maxlen];
 7 void get_next()
 8 {
 9     next[0]=-1;
10     int i=0,j=-1;
11     while(i<strlen(T)-1){
12         if(j==-1||T[i]==T[j]){
13             i++;j++;
14             if(T[i]!=T[j])
15                 next[i]=j;
16             else next[i]=next[j];
17         }else j=next[j];
18     }
19 }
20 int KMP()
21 {
22     int slen=strlen(S),tlen=strlen(T);
23     get_next();
24     int i=0,j=0;
25     while(i<slen&&j<tlen){
26         if(j==-1||S[i]==T[j]){
27             i++;j++;
28         }else{
29             j=next[j];
30         }
31     }
32     if(j==tlen) return i-j;
33     else return -1;
34 }
35 int main()
36 {
37     scanf("%s",S);
38     scanf("%s",T);
39     cout<<KMP()+1;
40     return 0;
41 } 
时间: 2024-11-03 03:45:54

KMP算法模板的相关文章

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

kmp算法模板及理解

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

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

Kmp 算法模板 C

/** * name:KMP * time:2012-11-22 * 字符串快速匹配 */ #include<stdio.h> #include<string.h> typedef struct seqstring{ char string[100]; int length; }seqstring; void getnext(seqstring p,int next[]){ int i,j; next[0]=-1;//next[0]放上-1 i=0;//指向字符串每个字符的指针 j

KMP算法的定义及KMP练手题 HDU 1711 Number Sequence (我的模板代码)

题意:就是要你来找出b数组在a数组中最先匹配的位置,如果没有则输出-1 思路:直接KMP算法(算法具体思想这位牛写的不错http://blog.csdn.net/v_july_v/article/details/7041827) AC代码: #include<cstdio> #include<cstring> #include<stdlib.h> #include<iostream> using namespace std; #define maxn 100

算法模板——KMP字符串匹配

功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置 原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单模板大量匹配待匹配串时,这个会有相当大的优势,AC自动机虽然好想一些,但是在这一类问题上的性价比就略低了 1 var 2 i,j,k,l,m,n:longint; 3 a:array[0..100000] of longint; 4 s1,s2:ansistring; 5 begin 6 readl

【模板】KMP算法

KMP算法用于字符串匹配 1 /*KMP*/ 2 #include<stdio.h> 3 #include<string.h> 4 char s1[1000005],s2[1005];//s1 为待匹配串,s2为模板串 5 int nxt[1005],n,m; 6 int main() 7 { 8 scanf("%s%s",s1+1,s2+1); 9 n = strlen(s1+1); m = strlen(s2+1); 10 nxt[1] = 0; int i

[模板]KMP算法

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

拓展KMP算法 入门+模板

拓展KMP算法入门 博客推荐 扩展KMP算法, 图很形象,代码写的也很清晰,下面的模板就是出自该博客文章. 拓展KMP是求母串S长度为n和子串T长度为m,求S的每一个后缀子串与T的前缀子串匹配的最长长度. 代码实现 //求解模式串T的next数组,这个函数和下面的函数几乎相同 void getnext(string &T, int m, int[] next) { int a = 0, p = 0; next[0] = m; //T字符串自身和自身匹配 for(int i=1; i<m; i