Solution -「NOI.AC 省选膜你赛」T2
这道题就叫 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]\) 中的回文子串个数。那么不交的回文子串对的对数为:
\]
\(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的更多相关文章
- Solution -「NOI.AC 省选膜你赛」array
题目 题意简述 维护一个长度为 \(n\) 的序列 \(\{a_n\}\),并给出 \(q\) 个操作: 将下标为 \(x\) 的数修改为 \(y\). 给定 \(l,r,k\),求最大的 \(m ...
- Solution -「NOI.AC 省选膜你赛」寄蒜几盒
题目 题意简述 给定一个含有 \(n\) 个顶点的凸多边形( \(n\) 是偶数),对于每一对相对的边(即中间有 \(\frac{n}2-1\) 条其它边),延长它们以将平面分割为多块,并把包含原 ...
- Solution -「NOI.AC 省选膜你赛」union
题目 题意简述 给定两颗树 \(A,B\),\(A\) 中的任一结点 \(u\) 与 \(B\) 中的任一结点 \(v\) 都有一个关系值 \(f(u,v)\),初始为 \(0\).再给出 \(q ...
- cdcqの省选膜你赛
cdcqの省选膜你赛 比赛当天因为在杠hnoi2016的大数据结构没有参加,今天补了一下.挺好玩的虽然不看一句话题意的话真的卡读题 此生无悔入东方,来世愿生幻想乡 2651. 新史「新幻想史 -现代史 ...
- Solution -「NOI 2021」「洛谷 P7740」机器人游戏
\(\mathcal{Description}\) Link. 自己去读题面叭~ \(\mathcal{Solution}\) 首先,参悟[样例解释 #2].一种暴力的思路即为钦定集合 \ ...
- Solution -「NOI 2020」「洛谷 P6776」超现实树
\(\mathcal{Description}\) Link. 对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...
- Solution -「NOI 模拟赛」彩色挂饰
\(\mathcal{Description}\) 给定一个含 \(n\) 个点 \(m\) 条边的简单无向图,设图中最大点双的大小为 \(s\),则保证 \(s\le6\).你将要用 \(k\) ...
- Solution -「NOI 模拟赛」出题人
\(\mathcal{Description}\) 给定 \(\{a_n\}\),求一个 \(\{b_{n-1}\}\),使得 \(\forall x\in\{a_n\},\exists i,j\ ...
- Solution -「NOI 2016」「洛谷 P1587」循环之美
\(\mathcal{Description}\) Link. 给定 \(n,m,k\),求 \(x\in [1,n]\cap\mathbb N,y\in [1,m]\cap \mathbb ...
随机推荐
- PPT2010初识
原文链接:https://www.toutiao.com/i6486689592241029645/ 一.认识PPT PPT是PowerPoint简称,主要用于演示文稿的创建,即幻灯片的制作演示软件. ...
- js获取相邻节点的value值
document.getElementById('id').nextElementSibling.value或者document.getElementById('id').previousElemen ...
- 最完整的springboot2.2.x.RELEASE整合springDataElasticsearch 7.6.2
本文使用内容 springBoot2.2.5.RELEASE版本 Elasticsearch7.6.2 linux版本的 SpringDataElasticSearch与Springb ...
- 安装MySQL到Ubuntu 20.04
本文的内容主要来自对How To Install MySQL on Ubuntu 20.04的翻译.在根据该文的指导下,我在自己的Ubuntu 20.04.3 LTS版本中安装了MySQL 8. St ...
- Centos上通过yum命令删除有关MySQL
1.停止mysql 服务service mysql stop 2.刚开始使用的yum安装的,使用以下语句进行卸载 yum remove mysql* 3.然后删除mysql旧版本已经存在的文件或者数据 ...
- 云图说|DDS读写两步走,带您领略只读节点的风采
摘要:为了扩展主节点的读请求能力,DDS提供具备独立连接地址的只读节点,适合独立系统直连访问,以缓解大量读请求给主节点造成的压力. 本文分享自华为云社区<[云图说]第235期 DDS读写两步走 ...
- vue项目再HBuilder打包成app后,有ui模块未添加的弹窗
直接在打包后的mainifst.json的文件夹中加入标注部分,我是这样解决了的
- Anchor CMS 0.12.7 跨站请求伪造漏洞(CVE-2020-23342)
这个漏洞复现相对来说很简单,而且这个Anchor CMS也十分适合新手训练代码审计能力.里面是一个php框架的轻量级设计,通过路由实现的传递参数. 0x00 漏洞介绍 Anchor(CMS)是一款优秀 ...
- python 使用sqlite,ConfigParser实例
此实例是本人公司真实场景,使用了VNC,ngrok 技术实现内网穿透,本例是对内网穿透的使用: 此例的最终效果是对于处于各地内网终端实现远程桌面监控及操作: 目前世面上也有一些软件实现了内网穿透(向日 ...
- SourceGenerator的应用: .Net多进程开发库 - Juxtapose
背景 进程间通讯属于老生常谈的话题,可能已经有很多的通信示例代码,但在实际使用中需要做的东西还比较多.例如协议定制.消息收发.进程管理等都需要实现,进阶需求可能还需要实现回调函数.取消等. 个人在工作 ...