20181229模拟 T1 palindrome
20181229模拟 T1 palindrome
题意 :
\(S\)是字符串\(s\)的子串可重集,求\(\sum\limits_{x\in S}\sum\limits_{y\in S}(|x|+|y|)\times [xy\ is \ palidrome]mod\ 2013265921\)。
分析:
\(2013265921\)的原根是\(31\),所以这道题我使用后缀自动机+回文树来解决。
注意到一个由两个字符串所组成的回文串\(xy\),不妨设\(|x|<|y|\),\(y\)显然是由一个回文串和一个\(x\)的反串组成。
于是我们可以枚举回文串的结尾\(i\),显然向右能被反串匹配的是一段区间,向左能匹配的所有回文串就是一直跳回文树上\(fail\)能到达的那些结点,求出此时向右匹配反串的种类\(c1\)和总长度\(s1\)向左匹配回文串的个数\(c2\)和总长度\(s2\),那么答案就是$\sum\limits_{i=1}^{n-1}c1_{i+1}\times s2_i+c2_i\times s1_{i+1} $。 然后这两个用后缀自动机+回文树即可完美解决。
然后不要忘记处理回文串在右反串在左的情况,我的做法是将整个字符串反过来重新求一遍。
最后需要加上回文串长度为\(0\)的方案。
code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define N 1000050
#define mem(x) memset(x,0,sizeof(x))
#define mod 2013265921
#define db(x) cerr<<#x<<" = "<<x<<endl
typedef long long ll;
int n;
char w[N];
ll s1[N],c1[N],c2[N],s2[N];
ll ss(ll l,ll r) {
return (l+r)*(r-l+1)/2%mod;
}
struct Sam {
int ch[N][26],fa[N],len[N],lst,cnt,ke[N],ro[N],siz[N];
ll sum[N],sd[N];
void init() {
lst=cnt=1;
}
void insert(int x) {
int p=lst,np=++cnt,q,nq; lst=np;
len[np]=len[p]+1;
for(;p&&!ch[p][x];p=fa[p]) ch[p][x]=np;
if(!p) fa[np]=1;
else {
q=ch[p][x];
if(len[q]==len[p]+1) fa[np]=q;
else {
nq=++cnt; len[nq]=len[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
for(;p&&ch[p][x]==q;p=fa[p]) ch[p][x]=nq;
}
}
siz[lst]++;
}
void kero() {
int i;
for(i=1;i<=cnt;i++) ke[len[i]]++;
for(i=1;i<=cnt;i++) ke[i]+=ke[i-1];
for(i=cnt;i;i--) ro[ke[len[i]]--]=i;
for(i=cnt;i>=1;i--) siz[fa[ro[i]]]+=siz[ro[i]];
for(i=2;i<=cnt;i++) {
int p=ro[i];
sd[p]=(sd[fa[p]]+siz[p]*(len[p]-len[fa[p]]))%mod;
sum[p]=(sum[fa[p]]+siz[p]*ss(len[fa[p]]+1,len[p]))%mod;
}
}
void pipei() {
int p=1,now=0,i;
for(i=n;i;i--) {
int x=w[i];
if(ch[p][x]) {
p=ch[p][x]; now++;
}else {
for(;p&&!ch[p][x];p=fa[p]) ;
if(!p) {
p=1; now=0;
}else {
now=len[p]+1; p=ch[p][x];
}
}
s1[i]=(sum[fa[p]]+siz[p]*ss(len[fa[p]]+1,now))%mod,c1[i]=(siz[p]*(now-len[fa[p]])+sd[fa[p]])%mod;
}
}
void clear() {
mem(ch);mem(fa);mem(len);mem(ke);mem(ro);mem(siz);mem(sum);mem(sd);
init();
}
}sam;
struct Pam {
int ch[N>>1][26],fail[N],len[N],cnt,lst,dep[N];
ll sum[N];
void init() {
len[1]=-1; fail[0]=fail[1]=1; cnt=1; lst=0;
}
void insert(int i,int x) {
int p=lst,np;
for(;w[i-len[p]-1]!=x;p=fail[p]) ;
if(!ch[p][x]) {
np=++cnt;
len[np]=len[p]+2;
int q=fail[p];
for(;w[i-len[q]-1]!=x;q=fail[q]) ;
fail[np]=ch[q][x];
ch[p][x]=np;
dep[np]=dep[fail[np]]+1;
sum[np]=(sum[fail[np]]+len[np])%mod;
}
lst=ch[p][x];
}
void wk() {
int i;
for(i=1;i<=n;i++) {
insert(i,w[i]);
c2[i]=dep[lst];
s2[i]=sum[lst];
}
}
void clear() {
mem(ch);mem(fail);mem(len);mem(dep);mem(sum);
init();
}
}pam;
int main() {
scanf("%s",w+1); n=strlen(w+1);
w[0]=29;
int i;
ll ans=0;
for(i=1;i<=n;i++) w[i]-='a';
sam.init(); pam.init();
for(i=1;i<=n;i++) sam.insert(w[i]);
sam.kero();
sam.pipei();
pam.wk();
for(i=1;i<=n;i++) s1[i]*=2;
for(i=1;i<=n;i++) {
ans+=(s1[i]*c2[i-1]+c1[i]*s2[i-1])%mod;
}
sam.clear();
pam.clear();
mem(s1);mem(s2);mem(c1);mem(c2);
reverse(w+1,w+n+1);
for(i=1;i<=n;i++) sam.insert(w[i]);
sam.kero();
sam.pipei();
pam.wk();
for(i=1;i<=n;i++) s1[i]*=2;
for(i=1;i<=n;i++) {
ans+=(s1[i]*(c2[i-1]+1)+c1[i]*s2[i-1])%mod;
}
printf("%lld\n",(ans+mod)%mod);
}
20181229模拟 T1 palindrome的更多相关文章
- 模拟T1数字number
那么第一题首先非常水的一道题…… 看一下题 数字(number) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK拥有n个数,这n个数分别是a1,a2,… ...
- 「题解」:07.16NOIP模拟T1:礼物
问题 A: 礼物 时间限制: 1 Sec 内存限制: 256 MB 题面 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼 ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...
- 5.4 NOI模拟
\(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...
- SQL Server数据库层面自定义数据同步性能测试
场景: A DB Server位于上海 B DB Server位于广州 现有特殊需求,需要通过数据链接将数据从A服务器表T1数据同步至B表T2 性能测试: 现模拟T1表9000笔数据 方式一:直接将9 ...
- APIO 2014
练习赛,评测的时候好像出了些问题,最后我拿自己机子测的212/300,第二题负责评测的写的SPJ就判了第一行的答案,不知道有没出什么问题. T1.palindrome 题目大意:给定一个长度为N的字符 ...
- 2019.07.05 纪中_B
今日膜拜:czj大佬orz%%% 2019.07.05[NOIP提高组]模拟 B 组 今天做题的时候大概能判断出题人的考点,可是就是没学过...特别痛苦 T0:栈的定义,模拟就好了T1:感觉像是找规律 ...
- 20210821 打表,蛇,购物,ants
考场 T1 没看懂 T4 一眼回滚莫队,但忘记怎么写了,小慌 模拟 T1 题意的时候教练让 zsy 澄清了一下,确定了我不会做... T2 一看就是毒瘤题,T3 感觉比较可做 T4 确定了回滚的细节, ...
- 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]
T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...
随机推荐
- str字符串、bool类型常用方法总结
字符串拼接 必须是字符串与字符串拼接 print('马化腾'+'马云') print('马化腾' * 10) 将打印10个马化腾 字符串翻转 [ : :-1] 字符串可以加和乘,不能减和乘 input ...
- grep命令详细解析 --非原创 原作者ggjucheng
简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...
- google黑客语法总结
搜索也是一门艺术 说起Google,可谓无人不知无人不晓,其强大的搜索功能,可以让你在瞬间找到你想要的一切.不过对于普通的用户而言,Google是一个强大的搜索引擎:而对于黑客而言,则可能是一款绝佳的 ...
- iOS 认识runtime 中的三个指针 isa , IMP , SEL
runtime中函数调用经常被提及的三个概念 isa,IMP,SEL 一 isa:是类指针,之所以说isa是指针是因为Class其实是一个指向objc_class结构体的指针,而isa 是它唯一的私 ...
- Python学习进程(12)模块
模块让你能够有逻辑地组织你的Python代码段. (1)python模块: 模块化的好处: 1.把相关的代码分配到一个模块里能让你的代码更好用,更易懂. 2.模块也是Python对象, ...
- 前端之CSS进阶
一.CSS属性操作 1.背景属性 常用: background-color 规定要使用的背景颜色 background-image 规定要使用的背景图像 background-repeat 规定如何重 ...
- 大话设计模式之PHP篇 - 单例模式
在编写PHP代码的时候,经常使用new关键字实例化一个对象,比如 <?php Class Database { } $db = new Database; 这是最常规的实例化操作方法,像数据库操 ...
- IntelliJ IDEA 中 右键新建时,选项没有Java class的解决方法和具体解释
我是在别人问我的时候,才发现还可以有这个问题,主要是他新项目直接打开,什么都没配置,就打算新建文件,其实可以直接看编辑器右下角的event log,那个对话框点开的话,可以add as maven p ...
- 关于图片上传与下载(Java)
图片的上传 package com.upload; import java.io.IOException;import java.io.PrintWriter; import javax.servle ...
- alisql部署
参考文章:https://www.fooher.com/20170808_136.html 对于mysql部署,编译时需要哪些参考,为什么需要,过多的还有需要了解my.cnf配置文件的参数,以及不同环 ...