【题解】Palindrome pairs [Codeforces159D]

传送门:\(Palindrome\) \(pairs\) \([CF159D]\)

【题目描述】

给定一个长度为 \(N\) 的字符串 \(S\),求有多少四元组 \((l_1,r_1,l_2,r_2)\) 满足 \(1 \leqslant l_1 \leqslant r_1 \leqslant l_2 \leqslant r_2 \leqslant N\) 且 \(S[l1...r1],\) \([Sl2...r2]\) 都是回文串。

【样例】

样例输入:
aa
样例输出:
1 样例输入:
aaa
样例输出:
5 样例输入:
abacaba
样例输出:
36

【数据范围】

\(100\%\) \(n \leqslant 2000\)


【分析】

由于这道题数据较小,直接写暴力也可以过(见隔壁大佬),但\(Palisection\) \([CF17E]\)就过不了了,这时候我们需要更高效的算法。

首先,用 \(Manacher\) 求出一个 \(f[i]\) 数组,用其表示以 \(a[i]\) 为中心最多可以匹配的回文串半径,那么就可以递推了。

实际上是要求互不相交的回文串对数,与\(Palisection\) \([CF17E]\)恰恰相反。

对于每一个回文串 \([l,r]\),凡是 \([1,l-1]\) 中的回文串都可以与之形成合法四元组,可以用 \(st[i],ed[i]\) 分别表示以 \(a[i]\) 开头和以 \(a[i]\) 结尾的回文串个数,那么 \(ans=\sum_{i=2}^{n}{\sum_{j=1}^{i-1}st[j]*ed[i]}\) 。

初始化时要对 \(st,ed\) 进行区间修改,查询时是单点查询,可以用线段树或者树状数组,不过有点麻烦,可以直接存差分数组,然后统计答案时用一个变量 \(S\) 优化掉枚举 \(st\) 求和的过程。

时间复杂度:\(O(n)\) 。

【Code】

#include<cstring>
#include<cstdio>
#define LL long long
#define Re register int
const int N=2003;
int n=1,m,p,q,f[N<<1];LL S,ans,st[N<<1],ed[N<<1];char a[N],b[N<<1];//记得开long long
inline int min(Re a,Re b){return a<b?a:b;}
int main(){
scanf("%s",a+1),m=strlen(a+1);
for(Re i=1;i<=m;++i,++n)b[++n]=a[i];//玄学填空法
b[0]=1,b[n+1]=2;//放置首尾两边多余部分被匹配
for(Re i=1;i<=n;++i){//Manacher
f[i]=q>i?min(f[(p<<1)-i],q-i):1;
while(b[i-f[i]]==b[i+f[i]])++f[i];
if(i+f[i]>q)q=(p=i)+f[i];
}
for(Re i=1;i<=n;++i){
++st[i-f[i]+1],--st[i+1];//区间修改[i-f[i]+1,i]
++ed[i],--ed[i+f[i]-1+1];//区间修改[i,i+f[i]-1]
}
for(Re i=1;i<=n;++i){
st[i]+=st[i-1],ed[i]+=ed[i-1];//差分求和算出单个的st,ed
if(!(i%2))ans+=S*st[i],S+=ed[i];
}
printf("%lld",ans);
}

【题解】Palindrome pairs [Codeforces159D]的更多相关文章

  1. LeetCode 336. Palindrome Pairs

    原题链接在这里:https://leetcode.com/problems/palindrome-pairs/ 题目: Given a list of unique words, find all p ...

  2. DP VK Cup 2012 Qualification Round D. Palindrome pairs

    题目地址:http://blog.csdn.net/shiyuankongbu/article/details/10004443 /* 题意:在i前面找回文子串,在i后面找回文子串相互配对,问有几对 ...

  3. 336. Palindrome Pairs(can't understand)

    Given a list of unique words, find all pairs of distinct indices (i, j) in the given list, so that t ...

  4. leetcode 132 Palindrome Pairs 2

    lc132 Palindrome Pairs 2 大致与lc131相同,这里要求的是最小分割方案 同样可以分割成子问题 dp[i][j]还是表示s(i~j)是否为palindrome res[i]则用 ...

  5. leetcode 131 Palindrome Pairs

    lc131 Palindrome Pairs 解法1: 递归 观察题目,要求,将原字符串拆成若干子串,且这些子串本身都为Palindrome 那么挑选cut的位置就很有意思,后一次cut可以建立在前一 ...

  6. 【LeetCode】336. Palindrome Pairs 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 HashTable 相似题目 参考资料 日期 题目地 ...

  7. [LeetCode] Palindrome Pairs 回文对

    Given a list of unique words. Find all pairs of distinct indices (i, j) in the given list, so that t ...

  8. 【LeetCode】Palindrome Pairs(336)

    1. Description Given a list of unique words. Find all pairs of distinct indices (i, j) in the given ...

  9. Palindrome Pairs -- LeetCode 336

    Given a list of unique words. Find all pairs of distinct indices (i, j) in the given list, so that t ...

随机推荐

  1. 中国工业的下一个十年在哪里?APS系统或将引领智能化转型

    为什么众多的ERP软件公司没有推出相关产品,当然可以肯定的是并非客户没有此观念,如果一定要说,也只能说目前的需求还不是非常强烈,从ERP厂商非常急切的与APS公司合作,甚至有高价购买APS公司代码的情 ...

  2. Fundebug录屏插件更新至0.4.0,修复BUG,优化性能

    摘要: 录屏功能更加强大,欢迎免费试用! 关于Fundebug录屏功能 Fundebug是专业的程序BUG监控服务,当线上应用出现BUG的时候,我们可以第一时间报警,帮助开发者及时发现BUG,提高De ...

  3. 创建readonly只读用户脚本

    身为一名运维工作人员,保证服务器的安全是必要项,当开发人员或测试人员需登录到服务器查看日志等操作时,可只给定特定的权限防止误操作的惨况产生. 以下脚本内容均为我本人环境,如有更改可自行修改. ~]# ...

  4. mybatis-plus手记

    项目源码:https://gitee.com/baomidou/mybatis-plus     https://github.com/baomidou/mybatis-plus 文档:https:/ ...

  5. ansible自动化运维04

    ansible playbook ansible-playbook命令格式: ansible-playbook  [option]  filename(剧本名字) ansible-playbook 命 ...

  6. NBU恢复数据库数据文件报错RMAN-06091

    RMAN-06091: no channel allocated for maintenance (of an appropriate type) 一.错误信息 报错信息如下 Starting res ...

  7. 机器学习——k-均值算法(聚类)

    文章目录 k-均值(k-means)聚类 1.k-均值算法 2.k-均值算法的代价函数 3.k-均值算法步骤 4.初始化聚类中心点和聚类个数 5.sklearn实现k-means算法 k-均值(k-m ...

  8. matplotlib 中的 colors 和 cmaps

    matplotlib 中的 148 种颜色 matplotlib 中的 160 种颜色映射 1.matplotlib中的 148 种颜色 import matplotlib as plm import ...

  9. 腾讯面试Android高级岗,居然被一个多线程基础面倒了?

    前言 一个在深圳从事开发五年的老友一个月前从原公司辞职后,昨天去腾讯总部面试Android高级岗,一面的时候,自我介绍后,陆陆续续问了很多问题,有着五年的从业经验很多项目开发的技术问题都回答的很通顺, ...

  10. 201871010112-梁丽珍《面向对象程序设计(java)》第四周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...