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 ...
随机推荐
- react中Fragment组件
什么是Fragment?在我们定义组件的时候return里最外层包裹的div往往不想渲染到页面,那么就要用到我们的Fragment组件了,具体使用如下: import React, { Compone ...
- vue中form 表单常用校验封装(async-validator)
新建一个js校验文件validate.js export const regular = { // 验证自然数 naturalNumber: /^(([0-9]*[1-9][0-9]*)|(0+))$ ...
- vue-json-editor可视化编辑器的介绍与应用
vue-json-editor可视化编辑器 最近项目中有用到json编辑器,我选用了这款vue的编辑器,看起来也是比较简洁,接下来就具体介绍一下它,以及内部属性. 一.vue-json-editor的 ...
- UML 有关类图知识及类间关系
原文链接:https://blog.csdn.net/mj_ww/article/details/53020346 1. 类的含义 类图(Class diagram)显示了系统的静态结构,而系统的静态 ...
- Google插件开发探索
简单的开始 https://blog.lateral.io/2016/04/create-chrome-extension-modify-websites-html-css/ 基础教程 https:/ ...
- 论文解读《The Emerging Field of Signal Processing on Graphs》
感悟 看完图卷积一代.二代,深感图卷积的强大,刚开始接触图卷积的时候完全不懂为什么要使用拉普拉斯矩阵( $L=D-W$),主要是其背后的物理意义.通过借鉴前辈们的论文.博客.评论逐渐对图卷积有了一定的 ...
- Go 转义字符及风格
今天来学习一下Go 中的转义字符,源码注释,规范的代码风格以及标准库API 文档; Go 转义字符常用的转义字符有以下几个:1. \t: 表示一个制表符(tab), 通常可以使用它进行排版; 2. \ ...
- IoC容器-Bean管理(bean生命周期)
1,生命周期 即从对象创建到对象销毁的过程 2,bean生命周期 (1)通过构造器创建bean实例(无参数构造) (2)为bean的属性设置值和对其他bean的引用(调用set方法) (3)调用bea ...
- 什么是HTTP? HTTP 和 HTTPS 的区别?
转载地址: 面试官:什么是HTTP? HTTP 和 HTTPS 的区别? 一.HTTP HTTP (HyperText Transfer Protocol),即超文本运输协议,是实现网络通信的一种规范 ...
- LNMP架构搭建
目录 一:LNMP架构简介 1.Nginx与uwsgi 二:django框架+python 1.创建用户 2.安装依赖包 3.安装uwsgi和django 4.测试python 5.创建django项 ...