题面:洛谷(带翻译)

题解:

  直接求相交不太好求,所以考虑求不相交的回文串对数。

  设ll[i]表示以i为开头的回文串个数,rr[i]表示结尾<=i的回文串个数。

  然后不相交的回文串对数显然就是对于每个$rr[i - 1] \cdot ll[i]$求一次和。

  最后再用全集减去不相交的回文串对数即可求出相交的回文串对数。

  那么如何求这2个数组呢?

    对于每个最长回文半径r[i],它可以对一个区间做出贡献,即以它为中心那些回文串的开头or结尾都在一个区间内,相当于每个r[i]都可以对某个区间做区间加。

    因此我们差分维护一下可以得到ll数组,同理也可以得到表示以i为结尾的回文串个数的数组,然后对这个数组求一次前缀和即可得到rr数组

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 2010000
#define ac 4001000
#define LL long long
#define p 51123987 int n, maxn, pos, len;
int r[ac];
LL ll[AC], rr[AC];
LL sum;
char ss[AC], s[ac]; void pre()
{
scanf("%d%s", &len, ss + );
s[] = '$', s[] = '#', n = (len << ) | ;
for(R i = ; i <= len; i ++) s[i << ] = ss[i], s[(i << ) | ] = '#';
} void manacher()
{
for(R i = ; i <= n; i ++)
{
r[i] = (maxn > i) ? min(r[(pos << ) - i], maxn - i + ) : ;
while(s[i + r[i]] == s[i - r[i]]) ++ r[i];
if(i + r[i] - > maxn) maxn = i + r[i] - , pos = i;
++ rr[(i + ) >> ], -- rr[(i + r[i]) >> ];
++ ll[(i - r[i] + + ) >> ], -- ll[(i >> ) + ];
}
for(R i = ; i <= len; i ++)
rr[i] = (rr[i] + rr[i - ]) % p, ll[i] = (ll[i] + ll[i - ]) % p;
for(R i = ; i <= len; i ++) rr[i] = (rr[i] + rr[i - ]) % p;//统计一次前缀和
} void work()
{
sum = rr[len] * (rr[len] - ) / % p;
for(R i = ; i <= len; i ++)
sum = (sum - rr[i - ] * ll[i] % p + p) % p;
printf("%lld\n", (sum + p) % p);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
manacher();
work();
// fclose(stdin);
return ;
}

CF17E Palisection manacher的更多相关文章

  1. CF17E Palisection(manacher/回文树)

    CF17E Palisection(manacher/回文树) Luogu 题解时间 直接正难则反改成求不相交的对数. manacher求出半径之后就可以差分搞出以某个位置为开头/结尾的回文串个数. ...

  2. CF17E Palisection(manacher)

    题意 给出一个长度为N的字符串S,问S中有多少个回文子串对(i,j)使得i,j在S中的位置相交?(N<=2*106) 题解 #include<iostream> #include&l ...

  3. CF17E Palisection 差分+manacher算法

    题目大意: 给定一个串$S$,询问有多少对相交的回文子串 直接做的办法: 我们先考虑求出以$i$为结尾的串的数量,这个很好统计 之后,我们再求出所有包含了点$i$的回文串的数目 这个相当于在$i$的左 ...

  4. Codeforces 17E Palisection - Manacher

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

  5. CF17E Palisection——优秀的综合计数题

    题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串 ...

  6. CF17E Palisection

    题意 给定一个长度为n的小写字母串.问你有多少对相交的回文子串(包含也算相交) 相交的回文子串个数 \(mod\ 51123987\) Sol 求相交的回文子串不太好求 考虑用总数减去不相交的回文串个 ...

  7. CF17E Palisection(回文自动机)

    题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串 ...

  8. CF17E Palisection (回文自动机+DP)

    题目传送门 题目大意:给你一个字符串,让你求出有多少对相交的回文子串 啊啊啊啊降智了,我怎么又忘了正难则反! 求相交会很难搞.把问题转化成求互不相交的回文子串再减一下就行了 先利用$PAM$求出以每个 ...

  9. CF17E Palisection(回文树)

    题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串 ...

随机推荐

  1. JS中的eval函数

           最近开始慢慢学习前端的脚本了,上次碰到了一个问题,需要通过一个对象的属性名称来获得这个对象这个属性的值.如果在C#中,那么直接通过反射就可以了.而在js中,也有类似的函数,那就是eval ...

  2. Linux 的字符串截取

    假设有变量 var=http://www.aaa.com/123.htm 1. # 号截取,删除左边字符,保留右边字符. echo ${var#*//} 其中 var 是变量名,# 号是运算符,*// ...

  3. java 通过内存映射文件来提高IO读取文件性能

    MappedByteBuffer out = new RandomAccessFile("src/demo20/test.dat", "rw"). getCha ...

  4. php oci8 小试

    Oracle_db.class.php <?phpclass Oracle_db{    public $link;    public function __construct(){      ...

  5. 如何使用Win+R快捷键打开自定义程序

    鉴于大家对于提高效率这块有争议,更改了下标题. 大家平时一定都使用过Win+R运行快捷键, 在运行里可以快捷的打开一些系统软件,比如说输入mstsc是打开远程连接,输入explorer是打开文件管理器 ...

  6. vps搭建个人网盘不二之选—kodexplorer介绍,包含安装步骤

    之前给大家介绍过seafile.h5ai等网盘系统,今天给大家介绍下kodexplorer网盘系统.Kodexplorer,也叫芒果云.可道云.kodcloud,总之名字改了不少.但其本身作为一个网盘 ...

  7. 如何使用HtmlTestRunner让自动化测试报告内容更丰富

    原文出自:http://www.cnblogs.com/tsbc/p/4128150.html 简述 使用selenium webdriver + Python做自动化测试,执行完成后要生成测试报告, ...

  8. c# 消息机制篡改

    1.背景介绍: c#程序想要针对某个的消息进行别的行为.例如:窗体不可拖动. 2.应用函数WinProc 以窗口不可拖动举例: const int WM_NCLBUTTONDOWN = 0x00A1; ...

  9. 404 Note Found -(课堂实战)- 项目UML设计(团队)

    目录 团队信息 分工选择 课上分工 课下分工 ToDolist alpha版本要做的事情 燃尽图 UML 用例图 状态图 活动图 类图 部署图 实例图 对象图 时序图 包图 通信图 贡献分评定 课上贡 ...

  10. 【SSH框架】之Struts2系列(一)

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系 1.Struts2框架概述 (1).什么是Struts2 Struts2是一种基于MVC模式的轻量 ...