uoj103 apio2014 Palindromes
题目链接: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的更多相关文章
- [APIO2014] [Uoj103] [Bzoj3676] Palindromes回文串 [Manacher,后缀数组]
用Manacher算法枚举回文子串,每次在后缀数组排序后的后缀数组中二分,因为用某一后缀和其他子串分别求匹配的长度,匹配长度在排序后该后缀的两侧具有单调性(匹配长度为min{H[x]|i<=x& ...
- 【APIO2014】Palindromes
#103. [APIO2014]Palindromes 统计 描述 提交 自定义测试 给你一个由小写拉丁字母组成的字符串 ss.我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这 ...
- UOJ#103. 【APIO2014】Palindromes PAM模板题
原文链接www.cnblogs.com/zhouzhendong/p/UOJ103.html 前言 我终于会PAM啦 感谢CLY大佬手把手教我PAM 题解 建个 PAM. 统计一下每一个节点的 Rig ...
- UOJ #103:【APIO2014】Palindromes
题意: 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. 学会马拉车之后发现还需要后缀数组才能AC ...
- [BZOJ3676][APIO2014]回文串(Manacher+SAM)
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 3097 Solved: 1408[Submit][Statu ...
- 【bzoj3676】[Apio2014]回文串 —— 回文自动机的学习
写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher.然后就码码码...过是过了,然后看一下[Status],怎么慢这么多,不服..然后就搜了一下,发现一种新东西——回文 ...
- BZOJ 3676: [Apio2014]回文串
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2013 Solved: 863[Submit][Status ...
- 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 ...
- hdu 1318 Palindromes
Palindromes Time Limit:3000MS Memory Limit:0KB 64bit ...
随机推荐
- 洛谷P1352 没有上司的舞会
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- [转] SQL Server中变量的声明和使用方法
原文地址 SQL Server中变量的声明和使用方法 声明局部变量语法: DECLARE @variable_name DataType 其中 variable_name为局部变量的名称,DataTy ...
- iOS Block学习
iOS4已经直接支持blocks,很有必要学习一下. 在ios中,将blocks当成对象来处理,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其 本身又 ...
- win7配置java环境变量
http://jingyan.baidu.com/article/9f63fb91d87fb0c8400f0e93.html 安装JDK,从Oracel官方网站上下载,也可以通过搜索,进入链接.下载完 ...
- win10中显示wpcap.dll丢失的处理方式
win10中显示wpcap.dll丢失的处理方式 学习了:https://jingyan.baidu.com/article/4f34706e30e673e387b56dd8.html 直接安装Win ...
- android存储訪问框架Storage Access Framework
在了解storage access framework之前.我们先来看看android4.4中的一个特性.假设我们希望能选择android手机中的一张图片,通常都是发送一个Intent给对应的程序.一 ...
- uva 10806 Dijkstra, Dijkstra. (最小费最大流)
uva 10806 Dijkstra, Dijkstra. 题目大意:你和你的伙伴想要越狱.你的伙伴先去探路,等你的伙伴到火车站后,他会打电话给你(电话是藏在蛋糕里带进来的),然后你就能够跑去火车站了 ...
- 我为什么不喜欢 CoreData
我为什么不喜欢 CoreData 我一直不喜欢 Core Data,以前不太敢明目张胆地这么表达,现在收集到越来越多相关的信息,所以给大家分享一下,我为什么不喜欢 Core Data. Core ...
- Android(Linux)模拟按键、触摸屏等事件
前提: 在我们应用程序或者在写Android自己主动化測试时候经常会须要模拟实体按键,来给我们做測试用.这也是我要整理的目的. 基本的涉及的是Linux Input Event事件. 下面的样例基于A ...
- huawei校招测试题
三道题两小时. 第一题,圈住所有点的长方形,很简单略过. 第二题:奇偶排序. 奇偶排序 描述: 输入若干(不超过1000个)非负整数数字,请先取出为奇数的数字按从大到小排序,再取出偶数从小到大进行排序 ...