[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\)为右端点的回文 ...
随机推荐
- ethereum(以太坊)(基础)--容易忽略的坑(一)
pragma solidity ^0.4.0; contract base{ address public _owner=msg.sender; uint _a; string internal _b ...
- 12.2.1 访问元素的样式【JavaScript高级程序设计第三版】
任何支持style 特性的HTML 元素在JavaScript 中都有一个对应的style 属性.这个style 对象是CSSStyleDeclaration 的实例,包含着通过HTML 的style ...
- 点按钮ajax get方法修改0或1状态封装成函数
最终效果 列表页面表格里点击按钮修改状态 按钮样式要引入bootstrap才可以用 本文件用的是laravel框架环境 larave路由里 Route::get('category/changesta ...
- 自定义控件,继承自 ListView
public class MyListView extends ListView { /** * 如果在xml中创建并设置了style,就会调用三个参数的. * * @param context * ...
- 使用virtual安装Windows系列操作系统总结
最近在安装Windows操作系统的过程中,发现总是报错,无法安装成功,后来经过不断地摸索,发现根本的问题在于镜像,所以在以后的大文件传输下载后,一定要校验其MD5值是否与源文件一致,需要的朋友可以联系 ...
- dz论坛Discuz_X3.4最新网站漏洞
近期我们sinesafe安全部门审计discuz最新版的时候发现配置文件写入导致代码执行的问题.cms安装的时候一般会分为几个步骤去进行,其中有对配置文件config进行写入的步骤,当写入的时候未严格 ...
- dotnet core 项目
项目 常用命令 我们使用dotnet core 命令行来创建项目及进行编译,发布等,比较常用的dotnet core 命令 如下: dotnet new [arguments] [options] 创 ...
- Xshell入门教程介绍
免费软件 Xshell和 Xftp 都是 NetSarang 出品的优秀网络管理.安全传输工具.Xshell 是一个免费的安全终端仿真器,可以作为 SSH.TELNET 或 RLOGIN 的终端模拟, ...
- L007- linux系统优化进阶课堂小节
首先把这节课所讲的大概引锁一下,然后下面详细列举. 1.填加普通用户,通过sudo管理. 2.更改默认的SSH服务端口及禁止root用户远程连接. 3.定时自动更新服务器时间 4.关闭防火墙(ipta ...
- php长整型完整输出
今天调用webservice时返回一个字段是int64 长整型 原始的数值应该是 190000002101056096 而php返回时转成 1.9000000210106E+17 当传入另一个接口就报 ...