ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【模板】回文树

2022-07-30 07:31:27  阅读:172  来源: 互联网

标签:int pattern id fail define pam 模板 回文


#include <stdio.h>
#include <string.h>
#include <bits/stl_algobase.h>
const int N = 524288;
struct PAM {
	int cid[26];
	int size, len;
	int fail;
	int cnt;
} pam[N];
#define sid(id,choice) pam[id].cid[choice]
#define size(id) pam[id].size
#define fail(id) pam[id].fail
#define len(id) pam[id].len
#define cnt(id) pam[id].cnt
int pam_tot, n;
char pattern[N];
int get(int x,int y) {
	while(pattern[y] != pattern[y-len(x)-1]) 
		x = fail(x);
	return x;
}
void pam_work() {
	n = strlen(pattern+1);
	++pam_tot;
	len(1) = -1;
	fail(0) = 1;
	pattern[0] = -1;
	for(int i = 1, pass = 0;i <= n;++i) {
		int sc = pattern[i]-'a';
		int id = get(pass,i);
		if(!sid(id,sc)) {
			++pam_tot;
			fail(pam_tot) = sid(get(fail(id),i),sc);
			len(pam_tot) = len(id)+2;
			sid(id,sc) = pam_tot;
			size(pam_tot) = size(fail(pam_tot))+1;
		}
		pass = sid(id,sc);
		++cnt(pass);
		//size : 以该字符为结尾的回文串个数;
		//len : 以该字符为结尾的最长回文串长度;
		//fail : 指向以该字符为结尾的最长回文串的最长回文子串;
		printf("%d %d %d %d\n",pass,size(pass),len(pass),fail(pass));
	}
}
int query_tot() {
	//pam_tot-1 即为本质不同回文串长度;
	return pam_tot-1;
}
long long query_longest() {
	long long res = 0;
	for(int i = pam_tot;~i;--i) {
		cnt(fail(i)) += cnt(i);
	}
	for(int i = 1;i <= pam_tot;++i) 
		res = std :: max(res,(long long)cnt(i)*len(i));
	return res;
}
signed main() {
	scanf("%s",pattern+1);
	pam_work();
	printf("%d\n",query_tot());
	printf("%lld",query_longest());
}

标签:int,pattern,id,fail,define,pam,模板,回文
来源: https://www.cnblogs.com/bikuhiku/p/PAM.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有