首页 > 其他分享 >KMP

KMP

时间:2024-07-17 13:52:45浏览次数:14  
标签:前缀 ll KMP 字符串 长度 最长 回文

CF1326D2 Prefix-Suffix Palindrome (Hard version)

给你一个由小写英文字母组成的字符串 \(s\) 。请找出满足以下条件的最长字符串 \(t\) :

  • \(t\) 的长度不超过 \(s\) 的长度。
  • \(t\) 是一个回文字符串。
  • 存在两个字符串 \(a\) 和 \(b\) (可能为空),使得 \(t = a + b\) (" \(+\) "表示连接)和 \(a\) 是 \(s\) 的前缀,而 \(b\) 是 \(s\) 的后缀。

这里KMP用于计算最长前缀最长回文串的长度。若是要计算最长后缀回文串的长度,只需将原字符串反转,然后计算反转后字符串的前缀最长回文串的长度即可。

具体方法:构造字符串\(S+\#+S'\)(其中\(S'\)表示字符串\(S\)的反转),然后计算前缀数组即可,最后一个元素的前缀数组值即为最长前缀最长回文串的长度。

原理:回文串的定义和前缀数组的定义。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define mid (((l)+(r))/2)
#define sq(x) ((x)*(x))
#define cu(x) ((x)*(x)*(x))
using namespace std;
typedef long long ll;
typedef long double ld;
const ll N=1e6+10,inf=1e18+10,mod=1e9+7;
ll n,m,kmp[N<<1];
char s[N],t[N<<1];
ll work(){
	for(ll i=2,j=0;i<=m;i++){
		while(j&&t[i]!=t[j+1])j=kmp[j];
		kmp[i]=j+=t[i]==t[j+1];
	}
	return kmp[m];
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int T;
	cin >> T;
	while(T--){
		cin >> (s+1);
		n=strlen(s+1);
		ll l=0,r=n+1;
		while(s[l+1]==s[r-1]&&l+1<r-1)l++,r--;
		for(ll i=l+1,m=0;i<=r-1;i++)t[++m]=s[i];
		t[++m]='#';
		for(ll i=r-1;i>=l+1;i--)t[++m]=s[i];
		ll lenl=work();
		for(ll i=r-1,m=0;i>=l+1;i--)t[++m]=s[i];
		t[++m]='#';
		for(ll i=l+1;i<=r-1;i++)t[++m]=s[i];
		ll lenr=work();
		for(ll i=1;i<=l;i++)cout << s[i];
		if(lenl>lenr)for(ll i=l+1;i<=l+lenl;i++)cout << s[i];
		else for(ll i=r-lenr;i<=r-1;i++)cout << s[i];
		for(ll i=r;i<=n;i++)cout << s[i];
		cout << endl;
	}
	return 0;
}

标签:前缀,ll,KMP,字符串,长度,最长,回文
From: https://www.cnblogs.com/alric/p/18307138

相关文章

  • KMP算法
    KMP算法KMP算法是一个字符串算法,通常用于匹配字符串。KMP算法的原理如果我们暴力枚举下标\(i,j\),\(i\)是文本串的下标,\(j\)是模式串(你要在文本串中匹配的字符串)的下标,时间复杂度\(O(NM)\),其中\(N,M\)分别为文本串和模式串的长度。我们看一下匹配过程:(gif动图请耐心观看)......
  • KMP算法
    KMP算法KMP算法是一个字符串算法,通常用于匹配字符串。KMP算法的原理如果我们暴力枚举下标\(i,j\),\(i\)是文本串的下标,\(j\)是模式串(你要在文本串中匹配的字符串)的下标,时间复杂度\(O(NM)\),其中\(N,M\)分别为文本串和模式串的长度。我们看一下匹配过程:(gif动图请耐心观看)......
  • 【算法篇】KMP算法,一种高效的字符串匹配算法
    我们今天了解一个字符串匹配算法-KMP算法,内容难度相对来说较高,建议先收藏再细品!!!KMP算法的基本概念KMP算法是一种高效的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。该算法的主要使用场景就是在字符串(也叫主......
  • KMP算法实例——模式匹配
    题目描述:给定两个字符串,一个是文本串txt,另一个是模式串pat。请使用KMP算法找出模式串在文本串中的所有出现位置。示例输入:文本串 txt:"ABABDABACDABABCABAB"模式串 pat:"ABABCABAB"#include<stdio.h>#include<string.h>//计算模式串的最长公共前后缀数组voidco......
  • 【漏洞复现】金斗云 HKMP智慧商业软件 任意用户创建漏洞
    0x01产品简介金斗云智慧商业软件是一款功能强大、易于使用的智慧管理系统,通过智能化的管理工具,帮助企业实现高效经营、优化流程、降低成本,并提升客户体验。无论是珠宝门店、4S店还是其他零售、服务行业,金斗云都能提供量身定制的解决方案,助力企业实现数字化转型和智能化升......
  • 代码随想录算法训练营Day9 | 字符串 151.翻转字符串单词 28.实现strStr() KMP算法介绍
    python中常用:        s[::-1]: 反转整个字符        s.strip():删除开头或结尾处的空白字符     s.split():字符拆分成单词 →list    “”.join(s):list→字符串   (持续更新…) 151.翻转字符串里的单词 题目: Leetcod......
  • CF631D Messenger (kmp + 字符串处理)
    CF631DMessengerkmp+字符串处理思路简单,写起来细节比较多首先要合并同类项,然后再考虑什么时候\(s=t\)。如果合并后\(t\)有一种或两种字符,那么都可以直接做;大于两种,我们发现匹配的条件为:中间部分完全相同,首尾字符相同并且\(s\)首尾字符的数量要大于\(t\)。中间部分完......
  • [字符串专题] KMP、Hash、Trie
    KMP核心思想:在每次失配时,不是把p串往后移一位,而是把p串往后移动至下一次可以和前面部分匹配的位置,这样就可以跳过大多数的失配步骤。而每次p串移动的步数就是通过查找next数组确定的。KMP主要分两步:求next数组、匹配字符串,其难点在于如何求next数组for(inti=1,......
  • day09 | KMP算法笔记
    目录一、KMP算法有什么用?二、构建next数组(就是前缀表)1)什么是前缀表(next数组)2)前缀表有什么用3)前缀表怎么记录的?4)为什么一定要用前缀表5)构建next数组三、力扣28.实现strStr()四、拓展题重复的子字符串一、KMP算法有什么用?该算法主要应用在字符串匹配上,当模式串与......
  • KMP
    前缀函数给定一个长度为\(n\)的字符串\(s\)(设下标从\(1\)开始),其前缀函数定义为一个长度为\(n\)的整数数组\(\pi\),其中\(\pi_i\)满足:\(s[1,\pi_i]=s[n-\pi_i+1,n]\)且\(\pi_i\nen\)。如果没有为\(0\)。最朴素的方法求\(\pi\)时间复杂度为\(O(n^3)\)。优......