KMP kmp模板

直接贴代码好了

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 int next[10010];
 7 char a[10010],b[10010];
 8
 9 int main(){
10     scanf("%s%s",a+1,b+1);
11     int lenb=strlen(b+1);
12     int j=0;
13     for(int i=2;i<=lenb;i++){//从2开始!!!
14         while(j&&b[j+1]!=b[i]) j=next[j];
15         j+=(b[j+1]==b[i]);
16         next[i]=j;
17     }
18     int lena=strlen(a+1);
19     j=0;
20     for(int i=1;i<=lena;i++){
21         while(j&&a[i]!=b[j+1]) j=next[j];
22         j+=(a[i]==b[j+1]);
23         if(j==lenb) printf("%d\n",i-lenb+1);
24     }
25     for(int i=1;i<=lenb;i++) printf("%d ",next[i]);
26     return 0;
27 }
时间: 2024-07-28 22:04:50

KMP 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超强模板贴一份

while(scanf("%s",str+1)==1 ) {        int n=strlen(str+1);        next[1]=0; int j=0;        for(int i=2;i<=n;i++) {            while(j&&str[j+1]!=str[i]) j=next[j];            if(str[i]==str[j+1]) j++;            next[i]=j;        } 

kmp算法模板及理解

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

KMP【模板】

当字符串匹配失败时,模式串的指针并没有指向0从头比较,而是指向了一个特定的位置,因为这个Next[j]指向的位置pos前长度为Next[pos]的子串,同模式串第j位前的长度为Next[j]的子串是相同的. 即S[0]~S[Next[j]]一定与S[len-1-Next[j]]~S[j-1]匹配. 1.既能做前缀又能做后缀的子串长度 ans[0] = len; int id = 1,i = len; while(Next[i] > 0) { ans[id++] = Next[i]; i = Ne

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(

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(模板)

字符串匹配:返回第一个匹配的首字母位置: void cal_next(char *str, int *next, int len) { next[0] = -1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀 int k = -1;//k初始化为-1 for (int q = 1; q <= len-1; q++) { while (k > -1 && str[k + 1] != str[q])//如果下一个不同,那么k就变成next[k],注意next

HDU1711 KMP(模板题)

Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24587    Accepted Submission(s): 10436 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1],