题意:

一个回文的价值为长度 * 出现次数,问一个串中的子串的最大回文价值

思路:

回文树模板题,跑PAM,然后计算所有节点出现次数。

参考:

回文串问题的克星——Palindrome Tree(回文树)

代码:

#include<map>
#include<set>
#include<cmath>
#include<cstdio>
#include<stack>
#include<ctime>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 300000 + 5;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
using namespace std;
struct PAM{int nex[maxn][26];  //指向的一个字符的节点int fail[maxn]; //失配节点int len[maxn];  //当前节点回文长度int str[maxn];  //当前添加的字符串int cnt[maxn];  //节点出现次数int last;int tot;    //PAM中节点数int N;  //添加的串的个数int newnode(int L){ //新建节点for(int i = 0; i < 26; i++) nex[tot][i] = 0;len[tot] = L;cnt[tot] = 0;return tot++;}void init(){tot = 0;newnode(0);newnode(-1);last = 0;N = 0;str[0] = -1;fail[0] = 1;}int getfail(int x){ //失配while(str[N - len[x] - 1] != str[N]) x = fail[x];return x;}void add(char ss){int c = ss - 'a';str[++N] = c;int cur = getfail(last);    //最长可扩增回文节点if(!nex[cur][c]){int now = newnode(len[cur] + 2);fail[now] = nex[getfail(fail[cur])][c];//cur后缀(除自己)的最长的能让now失配的后缀nex[cur][c] = now;}last = nex[cur][c];cnt[last]++;}void count(){for(int i = tot - 1; i >= 0; i--)   //父节点加上子节点出现的次数cnt[fail[i]] += cnt[i];}
}pa;
char s[maxn];
int main(){scanf("%s", s);pa.init();int len = strlen(s);for(int i = 0; i < len; i++){pa.add(s[i]);}pa.count();ll ans = 0;for(int i = 0; i < pa.tot; i++){ans = max(ans, ll(pa.len[i]) * ll(pa.cnt[i]));}printf("%lld\n", ans);return 0;
}

转载于:https://www.cnblogs.com/KirinSB/p/11250857.html

BZOJ 3676 回文串(回文树)题解相关推荐

  1. 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)

    题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...

  2. HYSBZ 2565 最长双回文串 (回文树)

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1377  Solved: 714 [Submit][Status][Dis ...

  3. HYSBZ - 3676 回文串(回文自动机)

    题目链接:点击查看 题目大意:求出回文子串中 出现次数*长度 的最大值 题目分析:回文自动机直接搞维护最大值就是答案了 代码: #include<iostream> #include< ...

  4. 论如何优雅的处理回文串 - 回文自动机详解

    写在前面 最近无意中看到了这个数据结构,顺便也就学习了一下. 而且发现网上关于这个算法的描述有很多地方是错的,在这里做了一些更正. 处理字符串的算法很多: KMP,E-KMP,AC自动机,后缀三兄弟: ...

  5. HYSBZ - 2565 最长双回文串(回文自动机)

    题目链接:点击查看 题目大意:给出一个字符串 s ,求最长双回文子串,题目规定最长双回文子串 t 可以拆成左右两部分,满足两部分都是回文串 题目分析:一开始读错题了,以为是双回文串本身也需要是回文串, ...

  6. SDUT F - 判断回文串

    F - 判断回文串 用线段树去维护字符串前缀哈希,基础的字符串哈希是在一整段哈希中截取一部分哈希,但线段树的维护恰好将其反转过来,是维护区间哈希,通过一种 与字符串哈希获取某一段哈希 相反的方法将其维 ...

  7. 回文算法java实现_java算法题:最长回文串

    LeetCode: 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串.在构造过程中,请注意区分大小写.比如"Aa"不能当做一个回文字符串.注 意:假设字 ...

  8. 判断回文串,最长回文串方法

    1.判断回文串 回文串就是从左看与从右看都是一样的字符串,例如abcba,acddca 判断一个字符串是否为回文串:如判断s=abcdcba是否为回文串,只要看s以中间位分界线,s的左右两边是否相等即 ...

  9. 【BZOJ2565】最长双回文串(回文树)

    [BZOJ2565]最长双回文串(回文树) 题面 BZOJ 题解 枚举断点\(i\) 显然的,我们要求的就是以\(i\)结尾的最长回文后缀的长度 再加上以\(i+1\)开头的最长回文前缀的长度 至于最 ...

  10. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

最新文章

  1. Matlab-bp神经网络
  2. api 定位 微信小程序 精度_微信小程序城市定位(借助百度地图API判断城市)
  3. 人脸识别技术如何应用到美颜领域?
  4. Goodbye 2020,Welcome 2021 | 沉淀 2021
  5. 阿里云飞天洛神2.0:开放弹性的云网络NFV平台
  6. PHP json_encode
  7. 在ASP.NET 3.5中使用新的ListView控件(4)
  8. 设计师不用下课了吧?小米突然官宣性价比之王旗舰:升降式摄像头
  9. LaunchImage命名与AppIcon命名(ios设置 启动图片和AppIcon图片)
  10. matlab开关电源仿真软件,开关电源仿真设计软件选择
  11. 计算机网络对大学生负面影响案例,大学生网络成瘾问题的危害及影响
  12. 转换、刻录DVD影碟光盘教程
  13. 解决fatal: could not get a repository handle
  14. Python视频制作 MoviePy框架afx音频效果示例
  15. 按头安利 好看又实用的运动健身 体育海报模板素材看这里
  16. [Android系统开发]Launcher Hotseat图标居中排列
  17. 最好的5个电脑上的epub阅读器
  18. 鼠标右键菜单跑到左边改回右边显示
  19. python 计算器 eval ctf_python 的eval函数
  20. C语言宏定义——一年有多少秒

热门文章

  1. 高端存储器研发再获突破 集成电路国产化进程加快
  2. Processing编程学习指南2.5 Processing中的代码
  3. 微信企业号支付个人php实现
  4. uiscrollview 图片放大缩小
  5. 上班族的真实生活写照-上班、加班、免费加班
  6. 2010.6.20 OA项目组一周工作报告
  7. 关于访问远程服务器的一些基本操作
  8. JAVA设计模式之工厂模式(简单,工厂,抽象)
  9. 免费的数据恢复软件 恢复丢失的数据
  10. 搞了 2 周性能优化,QPS 终于翻倍了!