原题

题目要求相交的回文串对数,这显然非常难,但是要有一种正难则反的心态,求不出来相交的,求出来不相交的不就好了!

对于每以位置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的更多相关文章

  1. Codeforces 17E Palisection 【Manacher】

    Codeforces 17E Palisection E. Palisection In an English class Nick had nothing to do at all, and rem ...

  2. Codeforces 17E Palisection - Manacher

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个串$s$询问,有多少对回文子串有交. 好像很简单的样子. 考虑能不能直接求,感觉有点麻烦.因为要考虑右端点在当前回文子串内还有区间包含 ...

  3. CodeForces 17E Palisection(回文树)

    E. Palisection time limit per test 2 seconds memory limit per test 128 megabytes input standard inpu ...

  4. 【Codeforces 17E】Palisection

    Codeforces 17 E 题意:给一个串,求其中回文子串交叉的对数. 思路1:用哈希解决.首先求出每个点左右最长的回文串(要分奇数长度和偶数长度),然后记录经过每个点的回文串的个数,以及它们是在 ...

  5. CF 17E Palisection 求相交回文串个数

    In an English class Nick had nothing to do at all, and remembered about wonderful strings called pal ...

  6. Codeforces

    Codeforces 7E #include <iostream> #include <cstring> #include <cstdio> #include &l ...

  7. 回文树练习 Part1

    URAL - 1960   Palindromes and Super Abilities 回文树水题,每次插入时统计数量即可. #include<bits/stdc++.h> using ...

  8. 回文树 Palindromic Tree

    回文树 Palindromic Tree 嗯..回文树是个什么东西呢. 回文树(或者说是回文自动机)每个节点代表一个本质不同的回文串. 首先它类似字典树,每个节点有SIGMA个儿子,表示对应的字母. ...

  9. Palisection(Codeforces Beta Round #17E+回文树)

    题目链接 传送门 题意 给你一个串串,问你有多少对回文串相交. 思路 由于正着做不太好算答案,那么我们考虑用总的回文对数减去不相交的回文对数. 而不相交的回文对数可以通过计算以\(i\)为右端点的回文 ...

随机推荐

  1. nodeJs 对 Mysql 数据库的 curd

    var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : ' ...

  2. chromedriver各个版本的下载

    驱动的下载地址如下: http://chromedriver.storage.googleapis.com/index.html 注意:64位向下兼容,直接下载32位的就可以啦,亲测可用.

  3. 勾股数--Python

    勾股数:勾股数又名毕氏三元数 .勾股数就是可以构成一个直角三角形三边的一组正整数.勾股定理:直角三角形两条直角边a.b的平方和等于斜边c的平方(a²+b²=c²) 要求:输出1000以内的勾股数 fr ...

  4. (数据科学学习手札17)线性判别分析的原理简介&Python与R实现

    之前数篇博客我们比较了几种具有代表性的聚类算法,但现实工作中,最多的问题是分类与定性预测,即通过基于已标注类型的数据的各显著特征值,通过大量样本训练出的模型,来对新出现的样本进行分类,这也是机器学习中 ...

  5. Rmarkdown:输出html设置

    在Rstudio中可自行更改主题样式 --- title: "题目" author: "name" date: "`r format(Sys.time ...

  6. NO-ZERO(空格补全)

    The NO-ZERO command follows the DATA statement REPORT Z_Test123_01. DATA: W_NUR(10) TYPE N. MOVE 50 ...

  7. python2.7练习小例子(十一)

        11):题目:判断101-200之间有多少个素数,并输出所有素数.     程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数.   ...

  8. ChipScope软件使用

    内容组织 1.建立工程  2.插入及配置核  2.1运行Synthesize  2.2新建cdc文件  2.3 ILA核的配置  3. Implement and generate programmi ...

  9. HBase-site.xml 常见重要配置参数

    HBase 常见重要配置参数 (1) Hbase.rpc.timeout rpc 的超时时间,默认 60s,不建议修改,避免影响正常的业务,在线上环境刚开始配置的是 3 秒,运行半天后发现了大量的 t ...

  10. Git使用之一:创建仓储和提交文件

    一.前期工作:   1.准备自己的文件夹用于同步文件   2.准备自己的Git账号,并设置好项目(推荐使用国产的码云)   3.安装Git软件 (下载地址: 32-bit Git for Window ...