【APIO2014】Palindromes
#103. 【APIO2014】Palindromes
统计
- 描述
- 提交
- 自定义测试
给你一个由小写拉丁字母组成的字符串 ss。我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这个子串的长度。
对于给你的这个字符串 ss,求所有回文子串中的最大存在值。
输入格式
一行,一个由小写拉丁字母(a~z)组成的非空字符串 ss。
输出格式
输出一个整数,表示所有回文子串中的最大存在值。
样例一
input
abacaba
output
7
explanation
用 ∣s∣∣s∣ 表示字符串 ss 的长度。
一个字符串 s1s2…s∣s∣s1s2…s∣s∣ 的子串是一个非空字符串 sisi+1…sjsisi+1…sj,其中 1≤i≤j≤∣s∣1≤i≤j≤∣s∣。每个字符串都是自己的子串。
一个字符串被称作回文串当且仅当这个字符串从左往右读和从右往左读都是相同的。
这个样例中,有 77 个回文子串 a,b,c,aba,aca,bacab,abacaba。他们的存在值分别为 4,2,1,6,3,5,74,2,1,6,3,5,7。
所以回文子串中最大的存在值为 77。
样例二
input
www
output
4
限制与约定
第一个子任务共 8 分,满足 1≤∣s∣≤1001≤∣s∣≤100。
第二个子任务共 15 分,满足 1≤∣s∣≤10001≤∣s∣≤1000。
第三个子任务共 24 分,满足 1≤∣s∣≤100001≤∣s∣≤10000。
第四个子任务共 26 分,满足 1≤∣s∣≤1000001≤∣s∣≤100000。
第五个子任务共 27 分,满足 1≤∣s∣≤3000001≤∣s∣≤300000。
时间限制:1s1s
空间限制:256MB256MB
下载
样例数据下载
思路:
1、manacher找出回文串
2、suffix数组向上向下二分找出串t出现次数
3、用RMQ加速
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N=3e5+5; typedef long long ll; int n,p[N<<2],f[N][21],log2[N]; char s[N],S[N<<1]; int c[N],h[N],sa[N],tsa[N],rank[N],trank[N]; ll ans; void DA(int maxx=256){int p;for(int i=1;i<=maxx;i++) c[i]=0;for(int i=1;i<=n;i++) c[rank[i]=s[i]]++;for(int i=1;i<=maxx;i++) c[i]+=c[i-1];for(int i=n;i;i--) sa[c[rank[i]]--]=i;trank[sa[1]]=p=1;for(int i=2;i<=n;i++){if(rank[sa[i]]!=rank[sa[i-1]]) p++;trank[sa[i]]=p;}for(int i=1;i<=n;i++) rank[i]=trank[i];for(int k=1;p<n;k<<=1,maxx=p){p=0;for(int i=n-k+1;i<=n;i++) tsa[++p]=i;for(int i=1;i<=n;i++) if(sa[i]>k) tsa[++p]=sa[i]-k;for(int i=1;i<=maxx;i++) c[i]=0;for(int i=1;i<=n;i++) trank[i]=rank[tsa[i]];for(int i=1;i<=n;i++) c[trank[i]]++;for(int i=1;i<=maxx;i++) c[i]+=c[i-1];for(int i=n;i;i--) sa[c[trank[i]]--]=tsa[i];trank[sa[1]]=p=1;for(int i=2;i<=n;i++){if(rank[sa[i]]!=rank[sa[i-1]]||rank[sa[i]+k]!=rank[sa[i-1]+k]) p++;trank[sa[i]]=p;}for(int i=1;i<=n;i++) rank[i]=trank[i];}for(int i=1,k=0;i<=n;i++){int j=sa[rank[i]-1];while(s[i+k]==s[j+k]) k++;h[rank[i]]=k;if(k>0) k--;} } void RMQ(){for(int i=1;i<=n;i++) f[i][0]=h[i];for(int i=2;i<=n;i++) log2[i]=log2[i>>1]+1;for(int j=1;j<=log2[n];j++){for(int i=1;i+(1<<j)-1<=n;i++){f[i][j]=min(f[i][j-1],f[i+(1<<j-1)][j-1]);}} } int query(int l,int r){if(l>r) return 0;//WA*1int k=log2[r-l+1];return min(f[l][k],f[r-(1<<k)+1][k]); } ll solve(int l,int r){if(l>r) return 0;//WA*1int pos=rank[l],L=0,R=pos,up=pos,dn=pos;while(L+1<R){//WA*1int mid=L+R>>1;if(query(mid+1,pos)>=r-l+1) R=mid,up=mid;else L=mid;}L=pos,R=n+1;//WA*1while(L+1<R){int mid=L+R>>1;if(query(pos+1,mid)>=r-l+1) L=mid,dn=mid;else R=mid;}return 1LL*(dn-up+1)*(r-l+1); } int opl,opr,lal=-1,rar=-1; void find(char c,int pos,int d){//WA*1bool f=0;if(c!='#') pos++;else f=1;pos/=2;d/=2;opr=pos+d;pos-=d;if(f) pos++;opl=pos; } void manacher(){int l=-1;for(int i=1;i<=n;i++) S[++l]='#',S[++l]=s[i];S[++l]='#';int id=0,mx=-1;ll t;for(int i=1;i<l;i++){if(id+mx>i) p[i]=min(p[id*2-i],id+mx-i);while(i-p[i]-1>=0&&i+p[i]+1<=l&&S[i-p[i]-1]==S[i+p[i]+1]){p[i]++;if(id+mx<i+p[i]){find(S[i],i,p[i]);if(opl==lal&&opr==rar) continue;lal=opl;rar=opr;//TLE*1t=solve(opl,opr);if(ans<t) ans=t;} }if(id+mx<i+p[i]) id=i,mx=p[i];} } int main(){scanf("%s",s+1);n=strlen(s+1);DA();RMQ();//WA*1 manacher();cout<<ans;return 0; }
转载于:https://www.cnblogs.com/shenben/p/6593356.html
【APIO2014】Palindromes相关推荐
- 【BZOJ3675】【Apio2014】序列分割
Description 传送门 Solution 之前我也遇到过一次这种"两段之和乘积作为贡献"的问题:考虑把这一种\((\sum) *(\sum)\)的形式拆括号,就可以发现 ...
- 【UOJ #105】【APIO2014】Beads and wires
http://uoj.ac/problem/105 好神的dp啊. 确定一个点为根之后,蓝线只能是竖着的,不能横跨兄弟. 枚举每个点为根进行树形dp是\(O(n^2)\)的,\(f(x,0/1)\)表 ...
- 【CodeForces】914 E. Palindromes in a Tree 点分治
[题目]E. Palindromes in a Tree [题意]给定一棵树,每个点都有一个a~t的字符,一条路径回文定义为路径上的字符存在一个排列构成回文串,求经过每个点的回文路径数.n<=2 ...
- 【BZOJ3677】[Apio2014]连珠线 换根DP
[BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做"连珠线".不出所料,玩这个游戏只需要珠子和线,珠子从1 ...
- HDU2029 Palindromes _easy version【入门】
Palindromes _easy version Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- 【入门6】函数与结构体【完结】
目录 P5735 [深基7.例1]距离函数 P5736 [深基7.例2]质数筛 P5737 [深基7.例3]闰年展示 P5738 [深基7.例4]歌唱比赛 P5739 [深基7.例7]计算阶乘 P54 ...
- POJ前面的题目算法思路【转】
1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...
- 【HDU100】杭电入门一百道 C++ 全 题 解
" Ctrl AC!一起 AC!" 题目集合链接:HDU2000-2099http://acm.hdu.edu.cn/listproblem.php?vol=11 前言 1. 好像 ...
- 【QBXT】学习笔记——Day3/4图论+dp
继续上传一波笔记吧. Day3 1.16AM 今天讲图论,以习题为主. 开篇水题: 给一幅图,若删去一个点后变成一棵树,则这个点合法.问哪些点合法. 思路根据树的性质:这个点不是割点,m-这个点的度数 ...
最新文章
- 如何理解LSTM后接CRF?
- ElasticSearch 2 (38) - 信息聚合系列之结束与思考
- PHP通过Thrift操作Hbase
- 男高音,女高音,男中音,女中音,男低音,女低音
- xmselect重新渲染_Layui使用总结及多选方案Xm-select
- 从“美屋”到“打扮家”:线下VR家居馆中的科技新体验
- java反射机制浅谈
- 如何学好初中计算机,初中生怎么学习方法好 十大方法告诉你
- [vue] 实际工作中,你总结的vue最佳实践有哪些?
- java自适应table_Java 设置Word中的表格自适应的3种方式
- java下载进度怎样判断_Java获得下载进度
- php图片滑动的属性,JavaScript_javascript图片滑动效果实现,本文为大家分享了javascript图片 - phpStudy...
- ASP.NET开发经验积累(转发)以后会陆续放上新的
- UML设计的9种图例
- 针对IE 7的hack写法
- LINUX(CENTOS)下载编译nload
- java反射之 Field对象
- Computer - 设置电脑眼睛保护色
- 计算某年某月某日到某年某月某日之间的天数
- Daedalus Icarus