BZOJ 3676 回文串
发布日期:2021-10-24 15:11:34 浏览次数:44 分类:技术文章

本文共 1116 字,大约阅读时间需要 3 分钟。

题意:给你一个串,回文串有个价值,定义为回文串的长度乘以次数,求最大值

思路:偷一份模板,附聚聚

代码:

#include 
using namespace std;typedef long long LL;inline LL read(){ LL x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}const int maxn = 300010*2;const int ALP = 26;struct Palindromic_Tree{ ///init,把每个字符add进PAM中,最后做一次Count int next[maxn][ALP];//next指针,next指针和字典树类似,指向的串为当前串两端加上同一个字符构成 int fail[maxn];//fail指针,失配后跳转到fail指针指向的节点 int cnt[maxn]; //表示节点i表示的本质不同的串的个数(建树时求出的不是完全的,最后Count()函数跑一遍以后才是正确的) int num[maxn]; //表示以节点i表示的最长回文串的最右端点为回文串结尾的回文串个数 int len[maxn];//len[i]表示节点i表示的回文串的长度(一个节点表示一个回文串) int S[maxn];//存放添加的字符 int last;//指向新添加一个字母后所形成的最长回文串表示的节点。 int n;//表示添加的字符个数。 int p;//表示添加的节点个数。 int newnode(int l){
//新建节点 for(int i=0;i
=0;--i)cnt[fail[i]]+=cnt[i]; //父亲累加儿子的cnt,因为如果fail[v]=u,则u一定是v的子回文串! }}pam;char s[maxn];int main(){ scanf("%s",s); int len=strlen(s); pam.init(); for(int i=0;i

 

转载于:https://www.cnblogs.com/lalalatianlalu/p/9998269.html

转载地址:https://blog.csdn.net/weixin_30800807/article/details/94926179 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:安装wampserver 计算机丢失msvcr100.dll
下一篇:Python学习笔记(2) - Python的main函数

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年03月29日 20时23分16秒