[codeforces] 17E Palisection
原题
题目要求相交的回文串对数,这显然非常难,但是要有一种正难则反的心态,求不出来相交的,求出来不相交的不就好了!
对于每以位置i结尾的字符串,在他后面与他不相交的就是以这个位置为结尾的个数和以这个位置以后为开头的乘积。
而答案就是总回文串个数sum*(sum-1)/2减去不相交个数
提到回文串,我们会想到manacher,但是这求出来的是中心的回文串最长半径,怎么转换成结尾和开头的个数呢?
对于已知位置i和以i为中心的回文串最长半径a[i],显然从i-a[i]到i都可以作为一个回文串的开头,i到a+a[i]都可以作为一个回文串的结尾,所以我们就会联想到差分!在转换过程中先把开头数组和结尾数组维护为查分,然后再还原即可。还原后要对开头数组维护一个后缀和,这样就可以O(n)了~!
#include<cstdio>
#include<algorithm>
#define N 2000010
#define mo 51123987
using namespace std;
long long n,l,a[2*N],f[2*N],g[2*N],ans,mxr,p,sum;
char s[2*N];
int main()
{
s[0]='@';
scanf("%d",&l);
getchar();
for (int i=1;i<=l;i++)
{
s[i*2-1]='#';
s[i*2]=getchar();
}
s[l*2+1]='#';
s[l*2+2]='?';
n=l*2+1;
for (int i=1,q;i<=n;i++)
{
if (mxr>i) q=min(mxr-i,a[p*2-i]);
else q=1;
while (s[i-q]==s[i+q]) q++;
a[i]=q;
sum+=(a[i]-1)/2;
if (i%2==0) sum++;
sum%=mo;
if (i+q>mxr) mxr=i+q,p=i;
}
sum=sum*(sum-1)/2;
for (int i=2;i<=n;i+=2)
{
f[i-a[i]+2]++;
f[i+2]--;
g[i]++;
g[i+a[i]]--;
}
for (int i=1;i<=n;i+=2)
{
f[i-a[i]+2]++;
f[i+1]--;
g[i+1]++;
g[i+a[i]]--;
}
for (int i=2;i<=n;i+=2)
{
f[i]+=f[i-2];
f[i]%=mo;
g[i]+=g[i-2];
g[i]%=mo;
}
f[n+1]=0;
for (int i=n-1;i>=1;i-=2)
{
f[i]+=f[i+2];
f[i]%=mo;
}
for (int i=2;i<=n;i+=2)
{
sum-=g[i]*f[i+2]%mo;
sum=(sum+mo)%mo;
}
printf("%lld\n",(sum%mo+mo)%mo);
return 0;
}
[codeforces] 17E Palisection的更多相关文章
- Codeforces 17E Palisection 【Manacher】
Codeforces 17E Palisection E. Palisection In an English class Nick had nothing to do at all, and rem ...
- Codeforces 17E Palisection - Manacher
题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个串$s$询问,有多少对回文子串有交. 好像很简单的样子. 考虑能不能直接求,感觉有点麻烦.因为要考虑右端点在当前回文子串内还有区间包含 ...
- CodeForces 17E Palisection(回文树)
E. Palisection time limit per test 2 seconds memory limit per test 128 megabytes input standard inpu ...
- 【Codeforces 17E】Palisection
Codeforces 17 E 题意:给一个串,求其中回文子串交叉的对数. 思路1:用哈希解决.首先求出每个点左右最长的回文串(要分奇数长度和偶数长度),然后记录经过每个点的回文串的个数,以及它们是在 ...
- CF 17E Palisection 求相交回文串个数
In an English class Nick had nothing to do at all, and remembered about wonderful strings called pal ...
- Codeforces
Codeforces 7E #include <iostream> #include <cstring> #include <cstdio> #include &l ...
- 回文树练习 Part1
URAL - 1960 Palindromes and Super Abilities 回文树水题,每次插入时统计数量即可. #include<bits/stdc++.h> using ...
- 回文树 Palindromic Tree
回文树 Palindromic Tree 嗯..回文树是个什么东西呢. 回文树(或者说是回文自动机)每个节点代表一个本质不同的回文串. 首先它类似字典树,每个节点有SIGMA个儿子,表示对应的字母. ...
- Palisection(Codeforces Beta Round #17E+回文树)
题目链接 传送门 题意 给你一个串串,问你有多少对回文串相交. 思路 由于正着做不太好算答案,那么我们考虑用总的回文对数减去不相交的回文对数. 而不相交的回文对数可以通过计算以\(i\)为右端点的回文 ...
随机推荐
- [转]Centos7 内核从3.10升级到4.12过程
[原文地址] http://blog.csdn.net/youshijifen/article/details/73472434 [摘要] 近期,国家互联网应急中心漏洞(CNCERT)公告中提到Lin ...
- angularjs路由不断刷新当前页面
最近做项目遇到个问题,使用angular-route的时候,第一次点击 [按钮 a]会进入按钮a对应的控制器,接着再次点击a按钮的的时候就不会进入控制器了.我想要的效果是每次点击都能进入control ...
- PHP入门笔记--基础语法一
一.基本语法 php标记 <?php ?> php代码结束标记 三种注释 // /**/ # 二.类型 四种标量类型:boolean, integer, float, string 三种复 ...
- Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正)
Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正) 置顶 2017年12月08日 11:19:11 阅读数:20277 官方原文: https://docs.djangoprojec ...
- java集合浅谈(一)
一.类库结构图概览 容器对象仅能持有对象引用(对象的指针),而不是Copy对象信息,从网上搜得几张Java中集合类库的结构图,如下所示: 二.解说Collection 2.1 Collection ( ...
- jenkins安全内容配置策略
有时我们使用HTML Publisher Plugin插件时,在jenkins点开html report,会发现没有带任何的css或js样式,这是因为Jenkins 1.641 / Jenkins 1 ...
- 关于相对布局RelativeLayout的各种属性介绍
RelativeLayout相对布局是个人觉得在android布局中比较常用且好用的一个,当然如果想让布局更漂亮是需要多种布局混合搭建的,这里就需要更深入的学习了,在这只介绍下有关相对布局的东西. 相 ...
- Python 3基础教程29-os模块
本文介绍os模块,主要是介绍一些文件的相关操作. 你还有其他方法去查看os 1. help() 然后输入os 2. Python接口文档,前面提到的用浏览器打开的,os文件路径为:C:\Users\A ...
- Python 3基础教程20-Python中导入模块和包
本文介绍Python中导入模块和包 #目录: # 导入模块和包--- # | # 上级包.上级模块.导入模块和包的init模块----- # | # 同级包.同级模块.上级包的init模块.test模 ...
- Linux系统安装jdk后出现无法执行binary 文件的错误解决
这是由于jdk版本的问题,针对Linux系统,Oracle提供了 ARM 的32jdk和64位jdk , 但是也提供了类似这样jdk-8u191-linux-i586.tar.gz32或64位的jdk ...