首页 技术 正文
技术 2022年11月6日
0 收藏 918 点赞 326 浏览 972 个字

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3676

【题目大意】

  考虑一个只包含小写拉丁字母的字符串s。
  我们定义s的一个子串t的”出现值”为t在s中的出现次数乘以t的长度。
  求s的所有回文子串中的最大出现值。

【题解】

  我们对给出串建立回文树,统计每个回文串出现次数和长度,相乘取组大即可

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=300010,S=26;
int all,son[N][S],fail[N],cnt[N],len[N],text[N],last,tot;
int newnode(int l){
for(int i=0;i<S;i++)son[tot][i]=0;
cnt[tot]=0,len[tot]=l;
return tot++;
}
void init(){
last=tot=all=0;
newnode(0),newnode(-1);
text[0]=-1,fail[0]=1;
}
int getfail(int x){
while(text[all-len[x]-1]!=text[all])x=fail[x];
return x;
}
void add(int w){
text[++all]=w;
int x=getfail(last);
if(!son[x][w]){
int y=newnode(len[x]+2);
fail[y]=son[getfail(fail[x])][w];
son[x][w]=y;
}cnt[last=son[x][w]]++;
}
void count(){for(int i=tot-1;~i;i--)cnt[fail[i]]+=cnt[i];}
char s[N];
int main(){
while(~scanf("%s",s)){
int n=strlen(s);
init();
for(int i=0;i<n;i++)add(s[i]-'a');
count(); long long ans=0;
for(int i=0;i<tot;i++)ans=max(ans,1LL*cnt[i]*len[i]);
printf("%lld\n",ans);
}return 0;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,083
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,558
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,407
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,180
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,817
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,900