首页 > 其他分享 >【模板】扩展 kmp (exkmp) / Z 函数

【模板】扩展 kmp (exkmp) / Z 函数

时间:2023-10-20 10:23:52浏览次数:30  
标签:exkmp 扩展 long kmp debug include 模板 define

求出一个字符串 \(s\) 的每个后缀与原串的 LCP。

首先由显然的 SAM 做法。考虑线性。

考虑维护区间 \([l,r]\) 表示 \([l,r]=[1,r-l+1]\) 是最右的匹配段。考虑新的 \(i\),如果满足 \(l\leq i\leq r\),则 \(i\) 可以直接取 \(i-l+1\) 的答案继续扩展,否则继续扩展。最后更新区间。

点击查看代码
#include <cstdio>
#include <vector>
#include <cstring>
#include <cassert>
#include <algorithm>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr,##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
typedef long long LL;
int n, m, z[1 << 26];
char a[1 << 26];
void exkmp(int len) {
	z[1] = len;
	debug("a = %s\n", a + 1);
	for (int i = 2, l = 0, r = 0; i <= len; i++) {
		if (i <= r) z[i] = min(z[i - l + 1], r - i + 1);
		while (i + z[i] <= len && a[1 + z[i]] == a[i + z[i]]) ++z[i];
		if (i + z[i] - 1 > r) r = i + z[l = i] - 1;
		debug("z[%d] = %d\n", i, z[i]);
	}
}
char buf[1 << 26];
int main(){
	scanf("%s%s", buf + 1, a + 1);
	n = strlen(a + 1), m = strlen(buf + 1);
	a[n + 1] = '?';
	for (int i = 1; i <= m; i++) a[n + i + 1] = buf[i];
	exkmp(n + m + 1);
	LL sum1 = n + 1, sum2 = 0;
	for (int i = 2; i <= n; i++) sum1 ^= 1ll * i * (z[i] + 1);
	for (int i = 1; i <= m; i++) sum2 ^= 1ll * i * (z[i + n + 1] + 1);
	printf("%lld\n", sum1);
	printf("%lld\n", sum2);
	return 0;
}

标签:exkmp,扩展,long,kmp,debug,include,模板,define
From: https://www.cnblogs.com/caijianhong/p/template-exkmp.html

相关文章

  • 占位符导入模板excel, 再导出xlsx
    1、引入包`<dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.1</version></dependency><dependency><groupId>or......
  • 模板
    模板读写读入快读intread(){ints=0,f=1;charx=getchar();while(x<'0'||'9'<x)f=(x=='-')?-1:1,x=getchar();while('0'<=x&&x<='9')s=s*10+x-......
  • 【模板】二维计算几何初步
    template<classT>structpoint{Tx,y;point():point(0,0){}point(Tx,Ty):x(x),y(y){}friendpointoperator+(constpoint&lhs,constpoint&rhs){return{lhs.x+rhs.x,lhs.y+rhs.y};}friend......
  • C++ 模板特化与偏特化:解析与应用
    引言在C++中,模板是一种非常强大的特性,它们允许我们编写通用、可重用的代码。但有时,我们需要为某些特定的数据类型或类提供特殊的实现,这时就需要使用到模板特化(TemplateSpecialization)和模板偏特化(PartialTemplateSpecialization)。本文将深入探讨这两者的概念、用法和注意事项......
  • C++模板笔记
    参考文章:https://juejin.cn/post/7078530622527897631模板是C++的泛型编程机制,这种机制可以最大程度复用代码并且不会增加运行时开销模板分为函数模板和类模板函数模板函数模板是对函数的参数进行泛型化,传递给模板函数的类型实参可以是类,也可以是整型值,还可以是模板名比如://......
  • 二分模板
    二分答案的写法有很多模板,但使用的情况各不相同前两种模板:都是while(l<r),但是会有区别的,区别在代码注释中有体现。后两种模板:都是while(l<=r),也是在返回上有区别。这是最大值最小intmain(){ intl; intr; while(l<r) { intmid=(l+r)/2; if(check()......
  • 一点模板
    线性素数筛:欧拉筛:定义数组prim[i]表示第i大的素数,isprim[i]表示i是否为素数(是否被筛过)从2~n遍历,if(!isprim[i])prim[++cnt]=i,如果遍历到i时i仍未被筛,则将i记录于prim数组中。接下来开始以i为基数筛除素数,我们发现:所有的合数都能被筛分割为若干数的积。所以无论i是否为......
  • Thymeleaf 模板引擎
    Thymeleaf简介Thymeleaf(https://www.thymeleaf.org/Thymeleaf3.0.15)是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于ApacheLicense2.0许可。Thymeleaf提供了一个用于整合SpringMVC的可选模块,在应用开发中,你可以使用Thymeleaf......
  • 考前模板整理
    有用的板子常用技巧inlinellread(){ llx=0,w=1; charch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') w=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=(x......
  • KMP
    fromSqStringimportSqStringMaxSize=100defGetNext(t,next): #由模式串t求出next值j,k=0,-1next[0]=-1whilej<t.getsize()-1:ifk==-1ort[j]==t[k]:#j遍历后缀,k遍历前缀j,k=j+1,k+1next[j]=kelse:k......