【模板】kmp

不断向失配处转移

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 1000005
using namespace std;
char t[maxn],p[maxn];
int f[maxn];
void getfail(char* p,int* f)
{
    int m=strlen(p),j;
    f[0]=0;f[1]=0;
    for (int i=1;i<m;i++) {
        j=f[i];
        while (j && p[i]!=p[j]) j=f[j];
        f[i+1]=p[i]==p[j]? j+1 : 0;
    }
}
void find(char* t,char* p,int* f)
{
    int n=strlen(t),m=strlen(p);
    getfail(p,f);
    int j=0;
    for (int i=0;i<n;i++) {
        while (j && p[j]!=t[i]) j=f[j];
        if (p[j]==t[i]) j++;
        if (j==m) printf("%d\n",i-m+2);
    }
}
int main()
{
    scanf("%s",&t);
    scanf("%s",&p);
    find(t,p,f);
    for (int i=1;i<=strlen(p);i++) printf("%d ",f[i]);
    return 0;
}
时间: 2024-10-27 12:50:24

【模板】kmp的相关文章

算法模板——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 int next[N]; 2 char str1[M],str2[N]; 3 //str1 长,str2 短 4 //len1,len2,对应str1,str2的长 5 6 void get_next(int len2) 7 { 8 int i = 0,j = -1; 9 next[0] = -1; 10 while(i<len2) 11 { 12 if(j == -1 || str2[i] == str2[j]) 13 { 14 i++; 15 j++; 16 if(str

[模板]KMP算法

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

P3375 模板 KMP字符串匹配

P3375 [模板]KMP字符串匹配 来一道模板题,直接上代码. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 5; int n, m; char s1[N], s2[N]; int nxt[N] ; void Get_next(char *s) { int j, L = strlen(s + 1); nxt[1] = j = 0; for(int i = 2; i

模板——kmp

这里简单存一下kmp算法代码 详细思路以后补上 inline void getnxt(){ for(int i=2,j=0;i<=n;i++){ while(j&&b[i]!=b[j+1]) j=nxt[j]; j+=(b[i]==b[j+1]); nxt[i]=j; } } inline void kmp(){ for(int i=1,j=0;i<=n;i++){ while(j&&a[i]!=b[j+1]) j=next[j]; j+=(a[i]==b[j+

洛谷P3375 [模板]KMP字符串匹配

To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了. 输入输出格式 输入格式: 第一行为一个字符串,即为s1(仅包含大写字母) 第二行为一个字符串,即为s2(仅包含大写字母) 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整

B - Oulipo HDU-1686

题目大意: 给一个t,接下来每个t两个串,求能匹配的次数. 解题思路: 修改模板kmp,不要j==len就结束while,而是在i==len才结束,由于这里是可重叠的匹配,所以 j==len时,j=next[j],ans++. 参考代码: 1 #include <iostream> 2 #include <vector> 3 #include <map> 4 #include <string> 5 #include <queue> 6 #incl

扩展KMP模板

扩展KMP:    给出模板串A和子串B,长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](0 <= i < lenA),求出A[i..lenA-1]与B的最长公共前缀长度,记为ex[i](或者说,ex[i]为满足A[i..i + z - 1]==B[0 .. z - 1]的最大的z值).    扩展KMP可以用来解决很多字符串问题,如求一个字符串的最长回文子串和最长重复子串.[算法]    设next[i]为满足B[i..i + z - 1] == B[0..z - 1]的最

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

hdu 1711 KMP算法模板题

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