题解 CF17E 【Palisection】】的更多相关文章

CF17E Palisection(manacher/回文树) Luogu 题解时间 直接正难则反改成求不相交的对数. manacher求出半径之后就可以差分搞出以某个位置为开头/结尾的回文串个数. 然后就容易求出不相交的对数,用总数减去即为答案. 啊是的这题好像也可以用回文树做. #include<bits/stdc++.h> using namespace std; namespace RKK { const int N=4000011,mo=51123987; void doadd(in…
卡空间PAM,2010没有PAM,所以都是马拉车 众所周知,PAM拥有十分优秀的时间复杂度,但空间复杂度lj得不行 但这题卡空间,所以得用到邻接链表PAM 先讲思路 题目要求相交的回文子串对,这很难做 于是我们求补集,求不相交的回文子串对,再用总数减即可 求法和上文的最长双回文子串 类似 正反建一次PAM,存该位置结尾的回文子串个数,然后加法改乘法 自己领悟一下,挺简单的. 现在讲一下邻接链表PAM 注意:邻接链表PAM不是使空间变小了,而是用时间换空间 我们记边结构体\(line\) 存\(3…
题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串个数%51123987 题解 首先,我们要知道一个串有多少个回文串. 1.manacher, 枚举回文中心可以计算出所有的回文串个数 (i+p[i]-1)-(i-p[i]+1)+1 然后我们怎么知道多少相交的回文串呢?计数问题要转化成有分界点的问题,便于利用乘法加法原理等.——lyd 这个相交显然不好处理,也…
题面:洛谷(带翻译) 题解: 直接求相交不太好求,所以考虑求不相交的回文串对数. 设ll[i]表示以i为开头的回文串个数,rr[i]表示结尾<=i的回文串个数. 然后不相交的回文串对数显然就是对于每个$rr[i - 1] \cdot ll[i]$求一次和. 最后再用全集减去不相交的回文串对数即可求出相交的回文串对数. 那么如何求这2个数组呢? 对于每个最长回文半径r[i],它可以对一个区间做出贡献,即以它为中心那些回文串的开头or结尾都在一个区间内,相当于每个r[i]都可以对某个区间做区间加.…
题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串个数%51123987 题解 直接判断相交的回文串很难 那我们考虑找出所有不相交的回文串 数量就是所有以$i$结尾的回文串数乘以$i$后面的回文串数 以$i$结尾的回文串数就是在fail树里$i$的深度 然后$i$后面的回文串数只要倒着做一遍再记录一个后缀和就好了 然后记$sum$为总共的回文串数,回文串对数…
题意 给出一个长度为N的字符串S,问S中有多少个回文子串对(i,j)使得i,j在S中的位置相交?(N<=2*106) 题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ; ; ],str[N*]; ],n,m,f[N*],g[N*],sum,ans,tot,num;…
题意翻译 给定一个长度为n的小写字母串.问你有多少对相交的回文子 串(包含也算相交) . 输入格式 第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式 相交的回文子串个数%51123987 Translated by liyifeng 题目描述 In an English class Nick had nothing to do at all, and remembered about wonderful strings called palindromes. We sh…
题目大意: 给定一个串$S$,询问有多少对相交的回文子串 直接做的办法: 我们先考虑求出以$i$为结尾的串的数量,这个很好统计 之后,我们再求出所有包含了点$i$的回文串的数目 这个相当于在$i$的左边加上一个等差数列,右边同理可以统计出来 二次差分后维护这些东西就可以做到$O(n)$ 听起来就很难打.... 考虑反面 求出所有不相交的回文子串对的数目 只需要求出所有的回文串的数目 以及以点$i$为开头的串的数目,和以点$1 ... i - 1$为结尾的串的数目 这两个也十分统计 $O(n)$即…
题意 给定一个长度为n的小写字母串.问你有多少对相交的回文子串(包含也算相交) 相交的回文子串个数 \(mod\ 51123987\) Sol 求相交的回文子串不太好求 考虑用总数减去不相交的回文串个数 那么考虑求以一个点结尾的后缀回文串的贡献: 就是以它后面的点为开头的前缀回文串的个数 正反两遍回文树求一下就好了 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) mems…
题目传送门 题目大意:给你一个字符串,让你求出有多少对相交的回文子串 啊啊啊啊降智了,我怎么又忘了正难则反! 求相交会很难搞.把问题转化成求互不相交的回文子串再减一下就行了 先利用$PAM$求出以每个位置为末尾的回文子串数量,这个数量就是此时构造末尾节点在$fail$树中的深度 再把串翻过来,用同样的方法求出每个位置为开头的回文子串数量 对其中一个数组求前缀和,用乘法原理算一下就行了 空间开不下怎么办?以时间换空间,用邻接表存儿子!每次跳儿子都暴力遍历一次邻接表 #include <cstdio…