P9576 题解
赛时没仔细想,赛后才发现并不难。
将 \(l,r\) 与 \(l',r'\) 是否相交分开讨论。
假若不相交,那么 \(l',r' < l\) 或者 \(l',r' > r\) 并且 \([l',r']\) 内的字符一定与字符串 \(t\) 匹配上了,考虑做一遍字符串匹配再利用乘法原理计算 \(l,r\) 的取值数量即可。
假若相交,那么就是区间 \([l',l]\) 与区间 \([r,r']\) 拼接起来构成了字符串 \(t\),不难想到这一定是一段 \(t\) 的前缀后缀拼接起来,所以自然可以考虑对于 \(s\) 字符串中每个位置求出其与 \(t\) 匹配的最大前缀后缀,然后实际上问题就变成了一个二维数点,考虑离线扫描一遍,线段树维护贡献即可。
考虑使用字符串哈希加上二分快速的求出相匹配的最大前缀后缀,加上线段树,总复杂度 \(O(n \log n)\),其中 \(n\) 是字符串长度。
#include<bits/stdc++.h>
#define int unsigned long long
//#define lowbit(x) (x&-(x))
using namespace std;
const int maxn = 1e6+114;
const int base = 1331;
int _pow[maxn];
int pre[maxn];//s的前缀哈希值
int Pre[maxn];//t的前缀哈希值
int L[maxn],R[maxn];//从s第i位开始匹配往左往右最多匹配多少位
char s[maxn],t[maxn];//字符串 s,t 下标从 1 开始
int ans;
int lens,lent;
bool check1(int pos,int len){
if(pos-len+1<1) return false;
int lt=pos-len+1,rt=pos;
int Lt=lent-len+1,Rt=lent;
return (pre[rt]-pre[lt-1])*_pow[Lt]==(Pre[Rt]-Pre[Lt-1])*_pow[lt];
}
bool check2(int pos,int len){
if(pos+len-1>lens) return false;
int lt=pos,rt=pos+len-1;
int Lt=1,Rt=len;
return (pre[rt]-pre[lt-1])*_pow[Lt]==(Pre[Rt]-Pre[Lt-1])*_pow[lt];
}
void init(){//预处理好以上所有数组
lens=strlen(s)-1;
lent=strlen(t)-1;
_pow[0]=1;
for(int i=1;i<maxn;i++) _pow[i]=_pow[i-1]*base;
for(int i=1;i<=lens;i++) pre[i]=pre[i-1]+(int)(s[i])*_pow[i];
for(int i=1;i<=lent;i++) Pre[i]=Pre[i-1]+(int)(t[i])*_pow[i];
for(int i=1;i<=lens;i++){
int l=0,r=lent+1;
while(l+1<r){
int mid=(l+r)>>1;
if(check1(i,mid)==true) l=mid;
else r=mid;
}
L[i]=l;
l=0,r=lent+1;
while(l+1<r){
int mid=(l+r)>>1;
if(check2(i,mid)==true) l=mid;
else r=mid;
}
R[i]=l;
}
for(int i=1;i<=lens;i++){
if(R[i]==lent){//匹配区域与删除区域不交
if(i>=1) ans+=(i-1)*i/2;
if(i<=lens-lent) ans+=(lens-(i+lent-1))*(lens-(i+lent-1)+1)/2;
}
}
}
int tr[maxn<<2],tag[maxn<<2];
#define ls(cur)(cur<<1)
#define rs(cur)(cur<<1|1)
void pushup(int cur){
tr[cur]=tr[ls(cur)]+tr[rs(cur)];
}
void pushdown(int cur,int lt,int rt){
int mid=(lt+rt)>>1;
tr[ls(cur)]+=tag[cur]*(mid-lt+1);
tag[ls(cur)]+=tag[cur];
tr[rs(cur)]+=tag[cur]*(rt-mid);
tag[rs(cur)]+=tag[cur];
tag[cur]=0;
}
void add(int cur,int lt,int rt,int l,int r,int v){
if(lt>rt) return ;
if(l<=lt&&rt<=r){
tr[cur]+=v*(rt-lt+1),tag[cur]+=v;
return ;
}
if(rt<l||lt>r) return ;
pushdown(cur,lt,rt);
int mid=(lt+rt)>>1;
add(ls(cur),lt,mid,l,r,v);
add(rs(cur),mid+1,rt,l,r,v);
pushup(cur);
}
int query(int cur,int lt,int rt,int l,int r){
if(lt>rt) return 0;
if(l<=lt&&rt<=r) return tr[cur];
if(rt<l||lt>r) return 0;
pushdown(cur,lt,rt);
int mid=(lt+rt)>>1;
return query(ls(cur),lt,mid,l,r)+query(rs(cur),mid+1,rt,l,r);
}
signed main(){
scanf("%s%s",s+1,t+1);
s[0]=t[0]='a';
init();
for(int i=lens;i>=1;i--){
if(i+lent<=lens){
add(1,1,lent,1,min(L[i+lent],lent-1),1);
}
ans+=query(1,1,lent,max((int)(1),lent-R[i]),lent-1);
}
printf("%lld",ans);
return 0;
}
P9576 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 万事通,专精部分领域的多功能 Transformer 智能体
介绍 我们很高兴分享"万事通"(Jack of All Trades,简称 JAT) 项目,该项目旨在朝着通用智能体的方向发展.该项目最初是作为对 Gato (Reed 等,202 ...
- Clion代码自动格式化保存
目录 前言 使用外部工具Artistic Style Clion 插件配置 注意 前言 使用Clion的时候,可以自动格式化代码的操作. 使用外部工具Artistic Style 序号 名称 地址 1 ...
- 用 C 语言开发一门编程语言 — 异常处理
目录 文章目录 目录 前文列表 异常捕获 定义 Lisp Value 函数 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器l> <用 C 语言开发一门编程语言 - 跨平台 ...
- USRP B210 软件定义的无线网络(SDR)支撑设备
目录 文章目录 目录 蜂窝网络 蜂窝网络的组成 USRP B210 USRP B210 的功能清单与相关参数 USRP B210 的系统结构与运行原理 相关知识储备 SDR RFIC RF 发展历程 ...
- PPO-KL散度近端策略优化玩cartpole游戏
其实KL散度在这个游戏里的作用不大,游戏的action比较简单,不像LM里的action是一个很大的向量,可以直接用surr1,最大化surr1,实验测试确实是这样,而且KL的系数不能给太大,否则惩罚 ...
- 二分法(POJ-1064与POJ-2456)
二分查找,简而言之就是在一个有序的序列中找一个元素,因为这些元素已经有序,所以每次都将要找的数跟待寻找序列的中间元素比较,如果要找的数大于中间元素,说明接下来只需要在该序列的右半边中找,所以可以不用管 ...
- C++ Virtual Functions
Virtual这个关键字在多态中扮演一个绝对重要的角色,只要member functions声明的前面加上virtual的关键字,他就会成为 Virtual member functions.任何一个 ...
- CSS——鼠标样式
在浏览网页的过程中,当我们将鼠标移动到一些元素上时,鼠标的样式会发生相应的改变,例如当鼠标指向文本时,鼠标的样式会变成类似大写字母I的样子:当鼠标指向链接时,鼠标会变成一个小手的形状等. 除了这些默认 ...
- SwiftObject 杂记
一.前言 看了一段时间的Swift,慢慢转变了一些对Swift的看法. Swift作为苹果新晋的开发语言.具有模板编程.函数编程.协议多继承.vTable静态绑定.值引用类型区分.Option类型等动 ...
- zookeeper:Unexpected exception, exiting abnormally ::java.io.EOFException
转载请注明出处: 服务器中断,重启服务器在重启kafka服务时,遇到如下报错: 2024-06-05 13:52:56,251 [myid:] - ERROR [main:ZooKeeperServe ...