正题

题目链接:https://www.luogu.com.cn/problem/P3649


题目大意

一个字符串,求最大的回文串长度×出现次数


解题思路

构建出\(\text{PAM}\)然后统计一下每个节点作为后缀的次数,\(fail\)树上上传一下信息就好了,时间复杂度\(O(n)\)。

当然也可以\(\text{SAM}+\text{Manacher}+\)倍增,因为一个字符串里本质不同的回文串就是会让马拉车的\(maxright\)增加的回文串,这些最多只有\(n\)个,马拉车跑出来的丢到\(\text{SAM}\)倍增找到对应节点即可。时间复杂度\(O(n\log n)\)

这里写的是\(\text{PAM}\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e5+10;
int n,tot,fail[N],len[N],cnt[N],ch[N][26];
char s[N];long long ans;
int get_fail(int x,int n){
for(;s[n-len[x]-1]!=s[n];)x=fail[x];
return x;
}
int Insert(int n,int x){
x=get_fail(x,n);
int c=s[n]-'a';
if(!ch[x][c]){
len[++tot]=len[x]+2;
int y=get_fail(fail[x],n);
fail[tot]=ch[y][c];
ch[x][c]=tot;
}
cnt[ch[x][c]]++;
return ch[x][c];
}
int main()
{
scanf("%s",s+1);n=strlen(s+1);
int last=0;len[1]=-1;fail[0]=tot=1;
for(int i=1;i<=n;i++)
last=Insert(i,last);
for(int i=tot;i>=1;i--)
cnt[fail[i]]+=cnt[i];
for(int i=1;i<=tot;i++)
ans=max(ans,1ll*len[i]*cnt[i]);
printf("%lld\n",ans);
}

最新文章

  1. Windows on Device 项目实践 2 - 感光灯制作
  2. Outlook不能预览和打开Excel文件:
  3. webapp中的meta
  4. MVC中Razor的使用 及路径问题
  5. Jsp内置对象及EL表达式的使用
  6. Is it possible to configure PostgreSQL to automatically close idle connections?
  7. delphi NativeXml的中文支持 乱码
  8. C#整理1——进制转换
  9. Html页面操作json串
  10. oracle如何导出和导入数据库表
  11. ARP攻击之Kali Linux局域网断网攻击
  12. Hystrix源码解析
  13. Linux中查看你的用户是否为root用户
  14. Android为ViewPager添加切换动画——自己定义ViewPager
  15. thymeleaf从session中获取数据
  16. 019PHP基础知识——函数(二)
  17. (Windows Maven项目)Redis数据库的安装和操作实现
  18. ELK之elasticsearch5.6的安装和head插件的安装
  19. 10 华电内部文档搜索系统 search03
  20. query 获取本身的HTML

热门文章

  1. 最简 jenkins-agent 镜像
  2. vue+cesium初探(一) 加载cesium
  3. node后台生成echarts图表
  4. 初识javaScript(慕课网学习笔记)
  5. JavaWeb之HttpSession
  6. 详解 Apache SkyWalking 跨进程传播协议
  7. 正整数a、b、c、d满足ab=cd,则a+b+c+d必定为合数。
  8. Java并发之AQS原理解读(三)
  9. PyPDF2.py 合并pdf时报错问题
  10. css 文字超出俩行省略号显示