题目链接: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. Hadoop三种模的安装配置过程

    JDK+Hadoop安装配置.单机模式配置 以下操作在SecureCRT里面完成 1.关闭防火墙 firewall-cmd --state 显示防火墙状态running/not running sys ...

  2. Ubuntu 16.04安装Jetty Web服务器

    一.下载 http://www.eclipse.org/jetty/download.html 二.安装 tar -zxvf jetty-distribution-9.4.7.v20170914.ta ...

  3. tcp-time-wait-state

    https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux

  4. java并发编程阻塞队列

    在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(LinkedList是双向链表,它实现了Dequeue接口). 使用非阻塞队列的时候有一个很大问题就是:它不会 ...

  5. uml精粹——10.状态机图

    10.状态机图state machine diagram   状态机图是常见的描写叙述一个系统行为的技术. 在面向对象的方法中,为单个类绘制一个状态机图来展示单个对象的生命周期行为. 见图10.1 图 ...

  6. [Testing] Static Analysis Testing JavaScript Applications

    The static code analysis and linting tool ESLint is the de-facto standard for linting JavaScript pro ...

  7. Variable 'bop' is uninitialized when captured by block

    代码: - (void)doTest { NSBlockOperation * bop = [NSBlockOperation blockOperationWithBlock:^{ if (!bop. ...

  8. opencv2反投影直方图以检測特定的图像内容

    #ifndef HISTOGRAM_H_ #define HISTOGRAM_H_ #include<opencv2/core/core.hpp> #include<opencv2/ ...

  9. 重构机房收费系统你要用的——异常处理和抛出异常(try catch finally)——(vb.net)

    你能保证你的程序不会出问题吗? 不能 当你的程序执行到某个地方发生了你不想要的结果.你是否想让它一错再错? 不想 你是否想让你的程序占着茅坑不拉屎? 不想 你是否想知道你的程序出错的原因? 想 个问题 ...

  10. 【前端】怎样成长为一名优秀的前端project师---

    浅谈本人的经验.也算是与大家交流吧,本人眼下也是从事前端的工作,时间并不长,说的不好,请见谅. 首先,前端project师必须得掌握HTML.CSS和JavaScript. 仅仅懂当中一个或两个还不行 ...