首页 > 其他分享 >PAM+回文串border理论

PAM+回文串border理论

时间:2023-09-27 14:22:06浏览次数:31  
标签:sz ch int maxn fail now border PAM 回文

PAM板子

#include <bits/stdc++.h>
using namespace std;
const int maxn = 300000 + 5;

namespace pam {
	int sz, tot, last;
	int cnt[maxn], ch[maxn][26], len[maxn], fail[maxn];
	char s[maxn];

	int node(int l) {  // 建立一个新节点,长度为 l
		sz++;
		memset(ch[sz], 0, sizeof(ch[sz]));
		len[sz] = l;
		fail[sz] = cnt[sz] = 0;
		return sz;
	}

	void clear() {  // 初始化
		sz = -1;
		last = 0;
		s[tot = 0] = '$';
		node(0);
		node(-1);
		fail[0] = 1;
	}

	int getfail(int x) {  // 找后缀回文
		while (s[tot - len[x] - 1] != s[tot]) x = fail[x];
		return x;
	}

	void insert(char c) {  // 建树
		s[++tot] = c;
		int now = getfail(last);
		if (!ch[now][c - 'a']) {
			int x = node(len[now] + 2);
			fail[x] = ch[getfail(fail[now])][c - 'a'];
			ch[now][c - 'a'] = x;
		}
		last = ch[now][c - 'a'];
		cnt[last]++;
	}

	long long solve() {
		long long ans = 0;
		for (int i = sz; i >= 0; i--) {
			cnt[fail[i]] += cnt[i];
		}
		for (int i = 1; i <= sz; i++) {  // 更新答案
			ans = max(ans, 1ll * len[i] * cnt[i]);
		}
		return ans;
	}
}  // namespace pam

char s[maxn];

int main() {
	pam::clear();
	scanf("%s", s + 1);
	for (int i = 1; s[i]; i++) {
		pam::insert(s[i]);
	}
	printf("%lld\n", pam::solve());
	return 0;
}

标签:sz,ch,int,maxn,fail,now,border,PAM,回文
From: https://www.cnblogs.com/thedreammaker/p/17732617.html

相关文章

  • 5. 最长回文子串
    https://leetcode.cn/problems/longest-palindromic-substring/description/前置知识取字符串的子串s.substr(start,len);//start是子串的起始位置,从0开始,len是子串的长度思路枚举回文字符串的中间位置i,如果回文字符串的长度为奇数,则从左右i-1,i+1两个方向遍历字符串,判断是否满足......
  • 力扣刷题笔记-05 最长回文子串
    05最长回文子串半山腰有点拥挤,你要去山顶看看。中心扩展法什么是回文从左边出发,字符的顺序和从右边出发是一样的,比如aba,abba。那么基于这个理论,我们就可以想到解决方案:找一个中心点,向两边出发,左右两边各移动一位,如果相同就证明是回文子串,不相同就停止,找下一个中心点中心点......
  • c# winfrom窗体设置无边框后修改窗体大小 FormBorderStyle设置none后修改窗体大小
    //窗体缩放constintGuying_HTLEFT=10;constintGuying_HTRIGHT=11;constintGuying_HTTOP=12;constintGuying_HTTOPLEFT=13;constintGuying_HTTOPRIGHT=14;constintGuying_HTBOTTOM=15;co......
  • Manacher——最快的找最长回文算法
    Manacher马拉车——Manacher算法解决的问题给定一串字符串str,求str内的最长回文子串,我们可以从最朴素的算法开始,逐渐深入Manacher算法。朴素穷举法一直枚举字符串str的子串,并判断子串是否为回文。这个时间复杂度直接到\(O(n^3)\)了,一般题目都会超时。中心扩散法作为一个回文......
  • html css dotted border 边框虚线太密
    三角形/**正三角*/.triangle{width:0;height:0;border-style:solid;border-width:025px40px25px;border-color:transparenttransparentrgb(245,129,127)transparent;}/**倒三角*/.triangle{width:0;height:0;border-style:solid;bor......
  • 最长回文子串
    给你一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb" classSolution{public:stringlongestPalindrome(strings......
  • 1275MPaMJ螺纹螺栓
    声明本文是学习GB-T42850-20231275MPaMJ螺纹螺栓.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们1范围本文件规定了1275MPaMJ螺纹螺栓(以下简称螺栓)的结构、尺寸和技术要求。本文件适用于1275MPaMJ螺纹螺栓的设计、制造和验收。2规范性引用文件......
  • 用栈来判断回文数
    代码如下所示:/***用栈实现回文数**/publicclassTest2{publicstaticvoidmain(String[]args){//测试代码System.out.println(isPalindromic("1221"));//输出true}//判断字符串是否回文,如果是数字的话可以转换为字符串再进行回文......
  • mpam linux kernel源码分析
    MPAM(MemorySystemResourcePartitioningandMonitoring)是Armv8.4的feature,用于cache和内存带宽的监控和限制。截至现在,该feature在linuxkernel的实现还在推进,最新一版参见https://git.kernel.org/pub/scm/linux/kernel/git/morse/linux.git/log/?h=mpam/snapshot/v6.5-rc1。......
  • hash判断回文串
    hash的计算方法参考《字符串哈希》建立正反两向的字符串哈希数组for(inti=1;i<=n;i++){p[i]=p[i-1]*P;h[i]=h[i-1]*P+str[i];//}for(inti=n;i>=1;i--){L[i]=L[i+1]*P+str[i];//}如果某一段字符串正向的hash值......