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 ...
随机推荐
- MySQL 表字段唯一性约束设置方法unique
1. 建表时加上唯一性约束 CREATE TABLE `t_user` ( `Id` int(11) NOT NULL AUTO_INCREMENT, -- 自增 `username` varchar ...
- Echart可视化学习(十一)
文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 官网找到类似实例, 适当分析,并且 ...
- Servlet部署描述符
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512237744641540612/ <Servlet简单实现开发部署过程>中的过程,可以概括为以下模 ...
- vue js格式化数字为金额格式
/** * @description 格式化金额 * @param number:要格式化的数字 * @param decimals:保留几位小数 默认0位 * @param decPoint:小数点 ...
- ROS之face recongination(cbo_peopel_detection)
一准备 Ros的cbo_people_detection网站http://wiki.ros.org/cob_people_detection 某网站来自Amir:http://edu.gaitech. ...
- Cesium源码剖析---Clipping Plane
之前就一直有写博客的想法,别人也建议写一写,但一直没有动手写,自己想了一下原因,就一个字:懒.懒.懒.为了改掉这个毛病,决定从今天开始写博客了,一方面对自己掌握的知识做一个梳理,另一方面和大家做一个交 ...
- Cesium入门8 - Configuring the Scene - 配置视窗
Cesium入门8 - Configuring the Scene - 配置视窗 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coini ...
- golang中json格式化自定义日期格式
go 的time.Time,在json序列化是默认 2006-01-02T15:04:05Z07:00 的格式,十分不便, encoding/json包在序列化和反序列化的时候分别调用encode.g ...
- 一起玩转玩转LiteOS组件:TinyFrame
摘要:TinyFrame是一个简单的用于解析串口(如 UART.telnet.套接字等)通信数据帧的库. 本文分享自华为云社区<LiteOS组件尝鲜-玩转TinyFrame>,作者:Lio ...
- 用了这么久 Linux ,才知道这些概念。。。
Linux 和 UNIX 中的文件系统是一个以 / 为根的树状式文件结构,/ 是 Linux 和 UNIX 中的根目录,同样它也是文件系统的起点.所有的文件和目录都位于 / 路径下,包括我们经常听到的 ...