这道题就叫 T2 我有什么办法www

题目

题意简述

  给定一个字符串 \(s\),其长度为 \(n\),求无序子串对 \((u,v)\) 的个数,其中 \((u,v)\) 满足 \(u,v\) 均为回文串且出现位置相交。

数据规模

  \(n\le2\times10^6\),字符集为小写字母(于是测试数据里有神奇的'{'字符。

题解

  难得的水题呐!

  正难则反,首先求出总的回文子串对数,再减去出现位置不交的对数。

  对于前者,用 Manacher 或者 PAM 都可以轻松求出,这里用的 PAM。

  对于后者,记 \(f(i)\) 为原串中以 \(i\) 结尾的回文串个数,\(g(i)\) 为 \(s[i..n]\) 中的回文子串个数。那么不交的回文子串对的对数为:

\[\sum_{i=1}^{n-1}f(i)g(i+1)
\]

  \(f\) 和 \(g\) 亦能用 PAM 求出,这道题就解决啦~

  最后测试数据出锅,AC 失败qwq。

代码

#include <cstdio>
#include <cstring>
#include <algorithm> const int MAXN = 2e6, MOD = 998244353, INV2 = 499122177;
char s[MAXN + 5];
int preend[MAXN + 5], sufend[MAXN + 5]; class PalindromeAutomaton {
private:
int cnt, lst, ch[MAXN + 5][26], len[MAXN + 5], link[MAXN + 5], dep[MAXN + 5]; public:
PalindromeAutomaton (): cnt ( 1 ), lst ( 1 ), len { 0, -1 }, link { 1, 0 } {}
inline void clear () {
for ( int i = 0; i <= cnt; ++ i ) {
dep[i] = link[i] = len[i] = 0;
for ( int j = 0; j < 26; ++ j ) ch[i][j] = 0;
}
cnt = lst = 1, len[1] = -1, link[0] = 1;
}
inline int build ( const char* str, int* endcnt ) {
int ret = 0;
for ( int i = 1; str[i]; ++ i ) {
int cid = str[i] - 'a', p = lst;
for ( ; str[i] ^ str[i - len[p] - 1]; p = link[p] );
if ( ! ch[p][cid] ) {
int cur = ++ cnt, q = link[p]; len[cur] = len[p] + 2;
for ( ; str[i] ^ str[i - len[q] - 1]; q = link[q] );
dep[cur] = dep[link[cur] = ch[q][cid]] + 1, ch[p][cid] = cur;
}
ret = ( ret + ( endcnt[i] = dep[lst = ch[p][cid]] ) ) % MOD;
}
return ret;
}
} pam; int main () {
scanf ( "%s", s + 1 );
int ans = pam.build ( s, preend ), n = strlen ( s + 1 );
ans = ( ans * ( ans - 1ll ) % MOD * INV2 % MOD + MOD ) % MOD;
pam.clear (), std :: reverse ( s + 1, s + n + 1 );
pam.build ( s, sufend ), std :: reverse ( sufend + 1, sufend + n + 1 );
for ( int i = n - 1; i; -- i ) sufend[i] = ( sufend[i + 1] + sufend[i] ) % MOD;
for ( int i = 1; i < n; ++ i ) ans = ( ( ans - 1ll * preend[i] * sufend[i + 1] % MOD ) % MOD + MOD ) % MOD;
printf ( "%d\n", ans );
return 0;
}

Solution -「NOI.AC 省选膜你赛」T2的更多相关文章

  1. Solution -「NOI.AC 省选膜你赛」array

    题目 题意简述   维护一个长度为 \(n\) 的序列 \(\{a_n\}\),并给出 \(q\) 个操作: 将下标为 \(x\) 的数修改为 \(y\). 给定 \(l,r,k\),求最大的 \(m ...

  2. Solution -「NOI.AC 省选膜你赛」寄蒜几盒

    题目 题意简述   给定一个含有 \(n\) 个顶点的凸多边形( \(n\) 是偶数),对于每一对相对的边(即中间有 \(\frac{n}2-1\) 条其它边),延长它们以将平面分割为多块,并把包含原 ...

  3. Solution -「NOI.AC 省选膜你赛」union

    题目 题意简述   给定两颗树 \(A,B\),\(A\) 中的任一结点 \(u\) 与 \(B\) 中的任一结点 \(v\) 都有一个关系值 \(f(u,v)\),初始为 \(0\).再给出 \(q ...

  4. cdcqの省选膜你赛

    cdcqの省选膜你赛 比赛当天因为在杠hnoi2016的大数据结构没有参加,今天补了一下.挺好玩的虽然不看一句话题意的话真的卡读题 此生无悔入东方,来世愿生幻想乡 2651. 新史「新幻想史 -现代史 ...

  5. Solution -「NOI 2021」「洛谷 P7740」机器人游戏

    \(\mathcal{Description}\)   Link.   自己去读题面叭~ \(\mathcal{Solution}\)   首先,参悟[样例解释 #2].一种暴力的思路即为钦定集合 \ ...

  6. Solution -「NOI 2020」「洛谷 P6776」超现实树

    \(\mathcal{Description}\)   Link.   对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...

  7. Solution -「NOI 模拟赛」彩色挂饰

    \(\mathcal{Description}\)   给定一个含 \(n\) 个点 \(m\) 条边的简单无向图,设图中最大点双的大小为 \(s\),则保证 \(s\le6\).你将要用 \(k\) ...

  8. Solution -「NOI 模拟赛」出题人

    \(\mathcal{Description}\)   给定 \(\{a_n\}\),求一个 \(\{b_{n-1}\}\),使得 \(\forall x\in\{a_n\},\exists i,j\ ...

  9. Solution -「NOI 2016」「洛谷 P1587」循环之美

    \(\mathcal{Description}\)   Link.   给定 \(n,m,k\),求 \(x\in [1,n]\cap\mathbb N,y\in [1,m]\cap \mathbb ...

随机推荐

  1. PPT2010初识

    原文链接:https://www.toutiao.com/i6486689592241029645/ 一.认识PPT PPT是PowerPoint简称,主要用于演示文稿的创建,即幻灯片的制作演示软件. ...

  2. js获取相邻节点的value值

    document.getElementById('id').nextElementSibling.value或者document.getElementById('id').previousElemen ...

  3. 最完整的springboot2.2.x.RELEASE整合springDataElasticsearch 7.6.2

    本文使用内容    springBoot2.2.5.RELEASE版本   Elasticsearch7.6.2  linux版本的   SpringDataElasticSearch与Springb ...

  4. 安装MySQL到Ubuntu 20.04

    本文的内容主要来自对How To Install MySQL on Ubuntu 20.04的翻译.在根据该文的指导下,我在自己的Ubuntu 20.04.3 LTS版本中安装了MySQL 8. St ...

  5. Centos上通过yum命令删除有关MySQL

    1.停止mysql 服务service mysql stop 2.刚开始使用的yum安装的,使用以下语句进行卸载 yum remove mysql* 3.然后删除mysql旧版本已经存在的文件或者数据 ...

  6. 云图说|DDS读写两步走,带您领略只读节点的风采

    摘要:为了扩展主节点的读请求能力,DDS提供具备独立连接地址的只读节点,适合独立系统直连访问,以缓解大量读请求给主节点造成的压力. 本文分享自华为云社区<[云图说]第235期 DDS读写两步走 ...

  7. vue项目再HBuilder打包成app后,有ui模块未添加的弹窗

    直接在打包后的mainifst.json的文件夹中加入标注部分,我是这样解决了的

  8. Anchor CMS 0.12.7 跨站请求伪造漏洞(CVE-2020-23342)

    这个漏洞复现相对来说很简单,而且这个Anchor CMS也十分适合新手训练代码审计能力.里面是一个php框架的轻量级设计,通过路由实现的传递参数. 0x00 漏洞介绍 Anchor(CMS)是一款优秀 ...

  9. python 使用sqlite,ConfigParser实例

    此实例是本人公司真实场景,使用了VNC,ngrok 技术实现内网穿透,本例是对内网穿透的使用: 此例的最终效果是对于处于各地内网终端实现远程桌面监控及操作: 目前世面上也有一些软件实现了内网穿透(向日 ...

  10. SourceGenerator的应用: .Net多进程开发库 - Juxtapose

    背景 进程间通讯属于老生常谈的话题,可能已经有很多的通信示例代码,但在实际使用中需要做的东西还比较多.例如协议定制.消息收发.进程管理等都需要实现,进阶需求可能还需要实现回调函数.取消等. 个人在工作 ...