首页 > 其他分享 >KMP板子

KMP板子

时间:2023-05-02 14:45:38浏览次数:52  
标签:int s2 s1 ret 板子 ++ KMP pi

P3426

#include <cstdio>
#include <cstring>
#include <vector>
#define sd std::
namespace m{ // }
constexpr int LEN = 1e6;
sd vector<int> prepare(char* a){
	int len = strlen(a);
	sd vector<int> ret(len);
	for(int i=1; a[i]; ++i){
		int j = ret[i-1];
		while(j && a[i] != a[j]) j = ret[j-1];
		if(a[i] == a[j]) ++j;
		ret[i] = j;
	}
	return ret;
}
char s1[LEN+1], s2[LEN+1];
void work(){
	scanf("%s%s", s1, s2);
	auto pi = prepare(s2);
	int len2 = strlen(s2);
	int j = 0;
	for(int i=0; s1[i]; ++i){
		while(j && s1[i] != s2[j]) j = pi[j-1];
		if(s1[i] == s2[j]) ++j;
		if(j == len2) printf("%d\n", i-len2+2), j = pi[j-1];
	}
	for(int i:pi){
		printf("%d ", i);
	}
}
} int main(){m::work(); return 0;}

标签:int,s2,s1,ret,板子,++,KMP,pi
From: https://www.cnblogs.com/x383494/p/17367663.html

相关文章

  • 高精度板子
    百度百科> #include<iostream>#include<vector>#include<string>usingnamespacestd;structwint:vector<int>{wint(intn=0){push_back(n);check();}wint&check()//{while(!empty......
  • KMP算法
    KMP算法用于解决字符串匹配问题,str1某个字符串是否与str2一样,如果一样,返回str2开始的位置//KMP算法模板intn,m;chars[N],p[M];intne[M];//s[]是长文本,p[]是模式串(短串),n是s的长度,m是p的长度//读入字符串cin>>n>>s+1>>m>>p+1;//KMP算法习惯下标从1......
  • 换根 DP 板子
    以前一直以为这玩意是随机应变的。结果还真能总结出板子。当然也有一定的局限性,比如\(dp\)值必须\(O(1)\)算。但不影响正常使用。ins:向\(k\)的子树信息中插入/删除\(nx\)的子树信息。这里的子树在dfs1中是指以\(1\)为根的子树;dfs2中是指以\(k\)为根。recalc......
  • KMP算法学习笔记
    总算把这个东西搞懂了......KMP是一个求解字符串匹配问题的算法。这个东西的核心是一个\(next\)数组,\(next_i\)表示字符串第\(0\simi\)项的相同的前缀和后缀的最大长度。这里的前缀和后缀概念略有不同,如DUCK的前缀为D,DU,DUC,后缀为K,CK,UCK,不包含DUCK本身。再举一个例子......
  • kmp
    #include<iostream>#include<string.h>#include<vector>usingnamespacestd;constintN=1e6+10;chars1[N],s2[N];intd[N];//d[i]表示以i结尾的字符串中最大公共前后缀的长度vector<int>v;voidinit()//得到模式串的d[]下标是从0开始的{intlen=strlen(......
  • codeforces 126B B. Password(kmp+dp)
    题目链接:codeforces126B题目大意:给出一个字符串,找出一个子串既是它的前缀,也是它的后缀,还是一个非后缀也非前缀的子串。题目分析:本来挺简单的一个题,最开始想复杂了,还用了后缀数组,醉了。这个题主要用的是kmp的next数组,首先我们要了解next数组的定义,next[i]表示以i为末尾的子串的后缀......
  • kmp + exkmp
    kmp:主要就是用于暴力回退的优化一般的暴力回退总是回退到前一个,要枚举很多次如果找到规律那么就会发现可以找到上一次最大匹配的位置然后将继续匹配知道匹配不下去然后去更新代码kmp是前缀到某一个为停止#include<bits/stdc++.h>usingnamespacestd;intn,m;intnx......
  • 26、字符串匹配 KMP 算法
    1、KMP算法的基本原理2、KMP算法的正确性证明3、什么是LPS数组4、LSP数组的计算5、实现LPS数组6、KMP算法的实现7、复杂度分析......
  • KMP算法
    KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。这里面的前缀集表示除去最后一个字符后的前面的所有子串集合,同......
  • 几个板子
    FHQTreap普通平衡树structtreap{ intl,r,siz,dat,val;}tr[N];intidx,rt;intget_new(intval){ tr[++idx].val=val; tr[idx].dat=rand(); tr[idx].siz=1; returnidx;}voidpushup(intu){ tr[u].siz=tr[tr[u].l].siz+tr[tr[u].r].siz+1;......