题目链接:http://uoj.ac/problem/103

题解:

首先,我们可以用后缀自动机算出每个字符串的出现次数。然后我们可以用manacher找出所有不同的回文串(o(n)个),统计答案即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 300005
using namespace std;
int n,tot,num[maxn<<1],ch[maxn<<1][26],fail[maxn<<1][20],len[maxn<<1],f[maxn<<1],last,pos[maxn<<1],cd[maxn<<1];
char s[maxn<<1];
long long ans,ans1,ans2;
int depend(int x){
int p=last,np=++tot;len[np]=len[p]+1;
while(p!=-1&&!ch[p][x])ch[p][x]=np,p=fail[p][0];
if(p==-1)fail[np][0]=0;
else{
int q=ch[p][x];
if(len[q]==len[p]+1)fail[np][0]=q;
else{
int nq=++tot;len[nq]=len[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fail[nq][0]=fail[q][0];fail[q][0]=fail[np][0]=nq;
while(p!=-1&&ch[p][x]==q)ch[p][x]=nq,p=fail[p][0];
}
}
return last=np;
}
int head,tail,d[maxn<<1];
void bfs(){
head=1;tail=0;
for(int i=1;i<=tot;i++)if(cd[i]==0)d[++tail]=i;
while(head<=tail){
int x=d[head++];
num[fail[x][0]]+=num[x];cd[fail[x][0]]--;
if(cd[fail[x][0]]==0)d[++tail]=fail[x][0];
}
}
int main(){
scanf("%s",s+1);n=strlen(s+1);fail[0][0]=-1;
for(int i=1;i<=n;i++)num[pos[i]=depend(s[i]-'a')]++;
for(int i=1;i<=tot;i++)cd[fail[i][0]]++;bfs();
fail[0][0]=0;
for(int i=1;i<20;i++)
for(int j=1;j<=tot;j++)
fail[j][i]=fail[fail[j][i-1]][i-1];
int id=1,mx=1;
for(int i=n;i;i--)s[i<<1|1]='#',s[i<<1]=s[i];
s[1]='#';ans=ans1=ans2=0;
for(int i=2;i<=(n<<1);i++){
if(i<=mx)f[i]=min(mx-i+1,f[id*2-i]);
else f[i]=1;
while(i-f[i]>0&&s[i+f[i]]==s[i-f[i]])f[i]++;
for(int j=mx-i+2;j<f[i];j+=2){
int p=pos[i/2+j/2];
for(int k=19;k>=0;k--)if(len[fail[p][k]]>=j)p=fail[p][k];
if(1LL*num[p]*j>ans)ans=1LL*num[p]*j,ans1=num[p],ans2=j;
}
if(i+f[i]-1>mx){id=i;mx=i+f[i]-1;}
}
printf("%lld\n",ans);
return 0;
}

  

uoj103 apio2014 Palindromes的更多相关文章

  1. [APIO2014] [Uoj103] [Bzoj3676] Palindromes回文串 [Manacher,后缀数组]

    用Manacher算法枚举回文子串,每次在后缀数组排序后的后缀数组中二分,因为用某一后缀和其他子串分别求匹配的长度,匹配长度在排序后该后缀的两侧具有单调性(匹配长度为min{H[x]|i<=x& ...

  2. 【APIO2014】Palindromes

    #103. [APIO2014]Palindromes 统计 描述 提交 自定义测试 给你一个由小写拉丁字母组成的字符串 ss.我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这 ...

  3. UOJ#103. 【APIO2014】Palindromes PAM模板题

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ103.html 前言 我终于会PAM啦 感谢CLY大佬手把手教我PAM 题解 建个 PAM. 统计一下每一个节点的 Rig ...

  4. UOJ #103:【APIO2014】Palindromes

    题意: 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. 学会马拉车之后发现还需要后缀数组才能AC ...

  5. [BZOJ3676][APIO2014]回文串(Manacher+SAM)

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 3097  Solved: 1408[Submit][Statu ...

  6. 【bzoj3676】[Apio2014]回文串 —— 回文自动机的学习

    写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher.然后就码码码...过是过了,然后看一下[Status],怎么慢这么多,不服..然后就搜了一下,发现一种新东西——回文 ...

  7. BZOJ 3676: [Apio2014]回文串

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2013  Solved: 863[Submit][Status ...

  8. UVA - 11584 Partitioning by Palindromes[序列DP]

    UVA - 11584 Partitioning by Palindromes We say a sequence of char- acters is a palindrome if it is t ...

  9. hdu 1318 Palindromes

    Palindromes Time Limit:3000MS     Memory Limit:0KB     64bit                                         ...

随机推荐

  1. 高性能mysql之schema与数据类型优化

    1.数据类型 http://www.cnblogs.com/YDDMAX/p/4937770.html

  2. [NOIP2012T3]开车旅行

    题目描述 NOIP 2012 提高组 题3小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ...

  3. spark学习常用的操作

    首先,使用 ScalaIDE 或 IDEA 创建 Scala 的 Maven 工程.需要用到 spark-core,spark-sql,spark-streaming 的 jar 包,pom 文件如下 ...

  4. Opengl配置

    Opengl配置说明: 本配置文档针对windows64位操作系统,配置vs2008项目工程 1.下载OpenGL的glut类库:http://www.opengl.org/resources/lib ...

  5. amplab

    https://github.com/amplab/SparkNet https://amplab.cs.berkeley.edu/

  6. TeX系列: tikz-3dplot绘图宏包

    tikz-3dplot包提供了针对TikZ的命令和坐标变换样式, 能够相对直接地绘制三维坐标系统和简单三维图形. tikz-3dplot包当前处于初创期, 有很多功能有待完善. 安装过程如下: (1) ...

  7. C# UserControl 判断是否是设计模式中

    In Windows Forms application, we can use Control.IsInDesignMode or LicenseManager.UsageMode == Licen ...

  8. 跟着实例学习设计模式(7)-原型模式prototype(创建型)

    原型模式是创建型模式. 设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象. 我们使用构建简历的样例的类图来说明原型模式. 类图: 原型模式主要用于对象的复制.它的核心是就是类图 ...

  9. 进程监控模块配置与使用 ------ACE(开源项目)

    下面我先从此工程的作用讲起: 此工程适用于程序异常退出,然后自动重启该程序.对于,系统重启不了该进程,那此程序将返回-1,也无法进行下一步工作. 下面,先从配置开始讲起: 参考资料:http://hi ...

  10. C#语言 循环语句

    //Console.Write("请输入关卡数:"); //int a = int.Parse(Console.ReadLine()); //int s = 0; //if (a ...