[codeforces] 17E Palisection
原题
题目要求相交的回文串对数,这显然非常难,但是要有一种正难则反的心态,求不出来相交的,求出来不相交的不就好了!
对于每以位置i结尾的字符串,在他后面与他不相交的就是以这个位置为结尾的个数和以这个位置以后为开头的乘积。
而答案就是总回文串个数sum*(sum-1)/2减去不相交个数
提到回文串,我们会想到manacher,但是这求出来的是中心的回文串最长半径,怎么转换成结尾和开头的个数呢?
对于已知位置i和以i为中心的回文串最长半径a[i],显然从i-a[i]到i都可以作为一个回文串的开头,i到a+a[i]都可以作为一个回文串的结尾,所以我们就会联想到差分!在转换过程中先把开头数组和结尾数组维护为查分,然后再还原即可。还原后要对开头数组维护一个后缀和,这样就可以O(n)了~!
#include<cstdio>
#include<algorithm>
#define N 2000010
#define mo 51123987
using namespace std;
long long n,l,a[2*N],f[2*N],g[2*N],ans,mxr,p,sum;
char s[2*N];
int main()
{
s[0]='@';
scanf("%d",&l);
getchar();
for (int i=1;i<=l;i++)
{
s[i*2-1]='#';
s[i*2]=getchar();
}
s[l*2+1]='#';
s[l*2+2]='?';
n=l*2+1;
for (int i=1,q;i<=n;i++)
{
if (mxr>i) q=min(mxr-i,a[p*2-i]);
else q=1;
while (s[i-q]==s[i+q]) q++;
a[i]=q;
sum+=(a[i]-1)/2;
if (i%2==0) sum++;
sum%=mo;
if (i+q>mxr) mxr=i+q,p=i;
}
sum=sum*(sum-1)/2;
for (int i=2;i<=n;i+=2)
{
f[i-a[i]+2]++;
f[i+2]--;
g[i]++;
g[i+a[i]]--;
}
for (int i=1;i<=n;i+=2)
{
f[i-a[i]+2]++;
f[i+1]--;
g[i+1]++;
g[i+a[i]]--;
}
for (int i=2;i<=n;i+=2)
{
f[i]+=f[i-2];
f[i]%=mo;
g[i]+=g[i-2];
g[i]%=mo;
}
f[n+1]=0;
for (int i=n-1;i>=1;i-=2)
{
f[i]+=f[i+2];
f[i]%=mo;
}
for (int i=2;i<=n;i+=2)
{
sum-=g[i]*f[i+2]%mo;
sum=(sum+mo)%mo;
}
printf("%lld\n",(sum%mo+mo)%mo);
return 0;
}
[codeforces] 17E Palisection的更多相关文章
- Codeforces 17E Palisection 【Manacher】
Codeforces 17E Palisection E. Palisection In an English class Nick had nothing to do at all, and rem ...
- Codeforces 17E Palisection - Manacher
题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个串$s$询问,有多少对回文子串有交. 好像很简单的样子. 考虑能不能直接求,感觉有点麻烦.因为要考虑右端点在当前回文子串内还有区间包含 ...
- CodeForces 17E Palisection(回文树)
E. Palisection time limit per test 2 seconds memory limit per test 128 megabytes input standard inpu ...
- 【Codeforces 17E】Palisection
Codeforces 17 E 题意:给一个串,求其中回文子串交叉的对数. 思路1:用哈希解决.首先求出每个点左右最长的回文串(要分奇数长度和偶数长度),然后记录经过每个点的回文串的个数,以及它们是在 ...
- CF 17E Palisection 求相交回文串个数
In an English class Nick had nothing to do at all, and remembered about wonderful strings called pal ...
- Codeforces
Codeforces 7E #include <iostream> #include <cstring> #include <cstdio> #include &l ...
- 回文树练习 Part1
URAL - 1960 Palindromes and Super Abilities 回文树水题,每次插入时统计数量即可. #include<bits/stdc++.h> using ...
- 回文树 Palindromic Tree
回文树 Palindromic Tree 嗯..回文树是个什么东西呢. 回文树(或者说是回文自动机)每个节点代表一个本质不同的回文串. 首先它类似字典树,每个节点有SIGMA个儿子,表示对应的字母. ...
- Palisection(Codeforces Beta Round #17E+回文树)
题目链接 传送门 题意 给你一个串串,问你有多少对回文串相交. 思路 由于正着做不太好算答案,那么我们考虑用总的回文对数减去不相交的回文对数. 而不相交的回文对数可以通过计算以\(i\)为右端点的回文 ...
随机推荐
- Array-快餐管饱
一.如何获得一个数组? rsp: 1. [] 2.new Array() 3.str.split() ps:new Array()可以不加括号,其传一个参数代表数组长度,两个及以上就是初始化数组. ...
- 做 JAVA 开发,怎能不用 IDEA!
用了 IDEA,感觉不错.决定弃用 Eclipse 入门教程: www.cnblogs.com/yangyquin/p/5285272.html
- SHELL里执行HIVE导出文件处理成CSV文件
#!/bin/bash #用途: #.当前目录的txt文件批量转csv #.制表符转逗号分隔符 #.NULL去除 #.删除WARN警告 for i in `ls ./*.txt` do sed -e ...
- 如何防御网站被ddos攻击 首先要了解什么是流量攻击
什么是DDOS流量攻击?我们大多数人第一眼看到这个DDOS就觉得是英文的,有点难度,毕竟是国外的,其实简单通俗来讲,DDOS攻击是利用带宽的流量来攻击服务器以及网站. 举个例子,服务器目前带宽是100 ...
- Redis 在springBoot中的一个使用示例
在现系统中使用了一个字典表,更新或插入字典表需要做Redis缓存 @Override @Cache(name = Constants.REDIS_PREFIX_DIC, desc = "变更 ...
- Black And White (DFS 训练题)
G - Black And White ================================================================================ ...
- TRANSLATE(转换大/小写并替换字符)
可以将字母 转换大/小 写或使用替 换规则. 要转换大/小 写,请使用 TRANSLATE 语句,用法 如下: 语法 TRANSLATE <c> TO UPPER CASE. TRANSL ...
- struts2官方 中文教程 系列八:异常处理
在本教程中,我们将探讨如何启用Struts 2框架处理web应用程序生成的任何未捕获的异常.Struts 2提供了健壮的异常处理,包括能够自动记录任何未捕获的异常,并将用户重定向到错误web页面. 贴 ...
- No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser").警告解决方法
在使用BeautifulSoup库时出现该警告,虽然不影响正常运行,但强迫症不能忍啊!! 详细警告信息如下: UserWarning: No parser was explicitly specifi ...
- JDBC剖析篇(2):JDBC之PreparedStatement
一次有人问我为什么要使用JDBC中的PreparedStatement,我说可以“防止SQL注入”,其他的却不能说出个一二三,现在来看看其中的秘密 参考文章: http://www.jb51.net/ ...