赛前训练4 字符串哈希

news/2025/10/2 19:18:18/文章来源:https://www.cnblogs.com/XOF-0-0/p/19123901

A

显然长度具有单调性,于是二分长度+map存储哈希值判断即可。

实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define ull unsigned long long
#define int long long
using namespace std;const int N=2e4+5;
const ull BASE=13331;
int n,k;
int a[N];
ull P[N],H[N];
string s;
map<ull,int> mp;int get(int l,int r){return H[r]-P[r-l+1]*H[l-1];
}
bool check(int x){for(int i=1;i+x-1<=n;i++){int h=get(i,i+x-1);mp[h]++;if(mp[h]==k)return 1;}return 0;
}signed main(){ios::sync_with_stdio(0);//cin.tie(0);cin>>n>>k;P[0]=1;for(int i=1;i<=n;i++)cin>>a[i],H[i]=H[i-1]*BASE+a[i],P[i]=P[i-1]*BASE;int l=0,r=n+1;while(l+1<r){int mid=(l+r)>>1;//cout<<mid<<'\n';if(check(mid))l=mid;elser=mid;}cout<<l;return 0;
}

B

把所有回文子串预处理出来然后树状数组统计即可。

实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define ull unsigned long long
#define int long long
#define pii pair<int,int>
using namespace std;const int N=2e3+5;
const ull BASE=13331;
int n,tot;
ull P[N],H1[N],H2[N];
pii p[N*N];
int tree[N];
string s;int geth1(int l,int r){return H1[r]-P[r-l+1]*H1[l-1];
}
int geth2(int l,int r){return H2[l]-P[r-l+1]*H2[r+1];
}
bool cmp(pii &x,pii &y){if(x.first==y.first)return x.second<y.second;return x.first<y.first;
}
int lowbit(int x){return x&-x;
}
void upd(int x,int y){for(;x<=n;x+=lowbit(x))tree[x]+=y;
}
int qry(int x){int res=0;for(;x;x-=lowbit(x))res+=tree[x];return res;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>s;n=s.size(),s='#'+s;P[0]=1;for(int i=1;i<=n;i++)P[i]=P[i-1]*BASE,H1[i]=H1[i-1]*BASE+s[i];for(int i=n;i>=1;i--)H2[i]=H2[i+1]*BASE+s[i];for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)if(geth1(i,j)==geth2(i,j))p[++tot]={i,j};sort(p+1,p+tot+1,cmp);int ans=0;for(int i=tot;i>=1;i--){ans+=qry(n)-qry(p[i].second);upd(p[i].first,1);}cout<<ans;return 0;
}

C

删掉本来就回文的前后缀,剩下的变成删除前缀/后缀的问题,可以枚举删掉的长度然后二分最长回文前后缀的长度用哈希判断即可。

实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define int long long
#define ull unsigned long long
using namespace std;const int N=5e5+5;
const ull BASE=13331;
int n;
ull P[N],H1[N],H2[N];
string s;int geth1(int l,int r){return H1[r]-P[r-l+1]*H1[l-1];
}
int geth2(int l,int r){return H2[l]-P[r-l+1]*H2[r+1];
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>s,n=s.size(),s='#'+s;P[0]=1;for(int i=1;i<=n;i++)P[i]=P[i-1]*BASE,H1[i]=H1[i-1]*BASE+s[i];for(int i=n;i>=1;i--)H2[i]=H2[i+1]*BASE+s[i];int l=1,r=n;while(l<r&&s[l]==s[r])l++,r--;int ans=l-1;if(l>=r){cout<<ans;return 0;}int extra=-1e18;for(int i=l;i<=r;i++){int lt=-1,rt=(r-i+1)/2+1;while(lt+1<rt){int mid=(lt+rt)>>1;if(geth1(i,i+mid-1)==geth2(r-mid+1,r))lt=mid;elsert=mid;}extra=max(extra,lt);}for(int i=r;i>=l;i--){int lt=-1,rt=(i-l+1)/2+1;while(lt+1<rt){int mid=(lt+rt)>>1;if(geth1(l,l+mid-1)==geth2(i-mid+1,i))lt=mid;elsert=mid;}extra=max(extra,lt);}cout<<ans+extra;return 0;
}

D

取反之后正反各做一遍哈希,然后注意到这个题的回文子串必定是偶数长度的,于是统计回文子串的数量即可。这是经典套路。(即枚举对称中心二分半径)

实现
//
//  C.cpp
//
//
//  Created by _XOFqwq on 2024/10/23.
//#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
using namespace std;const int N=5e5+5;
const int BASE=13331;
int n,ans;
ull hs1[N],hs2[N],p[N];
string s;void init_hs(){p[0]=1;for (int i=1; i<=n; i++) {hs1[i]=hs1[i-1]*BASE+s[i];p[i]=p[i-1]*BASE;}for (int i=n; i>=1; i--) {hs2[i]=hs2[i+1]*BASE+(s[i]=='0'?'1':'0');}
}
ull get_hs1(int l,int r){return hs1[r]-hs1[l-1]*p[r-l+1];
}
ull get_hs2(int l,int r){return hs2[l]-hs2[r+1]*p[r-l+1];
}
bool check(int pos,int x){int l=pos-x+1,r=pos+x;return get_hs1(l,r)==get_hs2(l,r);
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>s,s='#'+s;init_hs();for (int i=1; i<n; i++) {int l=0,r=min(i,n-i)+1;while (l+1<r) {int mid=(l+r)>>1;if (check(i,mid)) {l=mid;} else {r=mid;}}ans+=l;}cout<<ans;return 0;
}

总结:

  • 二分长度+哈希

  • 枚举中心点+二分长度统计回文子串数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress企业网站建设智慧农业项目方案

EventBus是android 下高效的发布/订阅事件总线机制&#xff0c;可以代替传统的Intent&#xff0c;Handler&#xff0c;BroadCast 或者Fragment&#xff0c;Activity&#xff0c;Service&#xff0c;线程之间传递数据&#xff0c;是一种发布订阅设计模式&#xff08;观察者模式&…

上海著名的网站制作公司杭州网站商场开发

美术教案第三课:曲曲直直(三年级美术下册教案)教学目标:认知目标:能够认识生活中的各种曲线和直线,说说曲线、直线给自己的感受.能力目标:能够用绘画、剪贴等方法表现曲线和直线的画面,培养学生自主探究的能力和创造能力.情感目标:通过收集不同直线、曲线材料进行创作,培养学生…

处处吻

你爱热吻却永不爱人 练习为乐但是怕熟人 你爱路过去索取见闻 陌路人变得必有份好感 你热爱别离 再合再离 似花瓣献技 叫花粉遍地 噢噢 你在播弄这穿线游戏 跟他结束 他与她再一起 你小心 一吻便颠倒众生 一吻便救一个人…

ThreadLocal原理与使用详解

ThreadLocal原理与使用详解 一、ThreadLocal 介绍 1.1 定义与核心特性定义:Java 官方文档描述,ThreadLocal 类用于提供线程内部的局部变量,多线程环境下通过 get() 和 set() 方法访问时,能保证各线程变量相对独立于…

WinCC监控框架实战解析:打通物联网网关的关键步骤

WinCC监控框架实战解析:打通物联网网关的关键步骤pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

2025国庆Day1

模拟赛 T1 对h离散化,枚举x,分类讨论某些位置淹没后段的个数的变化情况即可 可恶的毒瘤出题人竟然造了一个高度全0的hack 注意特判此时答案为0 #include<iostream> #include<cstdio> #include<cstdli…

网站内部链接有什么作用wordpress极慢

1005 K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能…

2025 年包装印刷厂家 TOP 企业品牌推荐排行榜,西安,陕西,咸阳包装印刷,礼盒,定制,设计,优质,品质,环保,生产包装印刷公司推荐!

引言在当前包装印刷行业发展进程中,企业面临着诸多亟待解决的问题。一方面,部分企业设备陈旧,难以满足市场对高精度、高质量包装印刷产品的需求,色彩还原度不足、套印偏差等问题频发,影响产品外观质感与品牌形象;…

python-dotenv正则表达式应用:麻烦变量名的匹配技巧

python-dotenv正则表达式应用:麻烦变量名的匹配技巧2025-10-02 18:54 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…

2025 编码器厂家 TOP 企业品牌推荐排行榜,无磁,光学,脉冲,绝对型,伺服,机械多圈,工业,二进制,拉线编码器公司推荐

引言在当前工业自动化快速发展的背景下,编码器作为高精度闭环控制系统中位置和速度反馈的关键传感器,其市场需求日益增长。然而,行业内却面临着诸多问题,不同厂家的产品质量参差不齐,部分厂家缺乏核心技术创新能力…

2025 年玻璃钢水箱厂家 TOP 企业品牌推荐排行榜,30 吨,订做,消防,专业,方形,拼装式,屋顶,大型玻璃钢水箱推荐这十家公司!

引言随着建筑、化工、食品、医药等行业的快速发展,市场对玻璃钢水箱的需求持续攀升,但行业发展过程中也面临诸多问题。部分生产厂家技术储备不足,生产的产品质量稳定性差,无法满足不同行业对水箱设备的严苛要求;有…

Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频语义理解与智能检索进阶 - 实践

Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频语义理解与智能检索进阶 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…

Spark专题-第三部分:性能监控与实战优化(1)-认识spark ui - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

禁止DataGridView自动根据数据源的结构生成列

代码展示: this.dgv_SysAdmin.AutoGenerateColumns = false;

2025 年压球机厂家 TOP 企业品牌推荐排行榜,新型,高压,节能,双螺旋干粉,对辊,煤粉,超低压压球机公司推荐!

引言在工业生产领域,压球机作为物料成型的关键设备,其重要性不言而喻。随着各行业对物料成型需求的不断增长,压球机市场呈现出蓬勃发展的态势。然而,当前行业内品牌众多,产品质量参差不齐,给客户的选择带来了极大…

2025 年磨粉机厂家 TOP 企业品牌推荐排行榜,新型磨粉机,超细磨粉机,立式双动力磨粉机,节能磨粉机公司推荐!

引言在现代工业体系中,磨粉机作为重要的粉体加工设备,广泛应用于矿山、建材、化工、食品、医药等诸多领域。不同行业对于磨粉机的性能、精度、产能以及环保等方面有着多样化的需求。然而,当前磨粉机市场品牌众多,产…

2025 年等离子清洗机厂家 TOP 企业品牌推荐排行榜,大气,真空,宽幅,微波,自动化,常压,低温,大腔体,射频,DBD,介质阻挡放电等离子清洗机公司推荐!

引言在当前工业制造领域,等离子清洗技术凭借其高效、环保的特性,被广泛应用于 3C、半导体、光伏、汽车等多个行业。然而,随着市场需求的不断增长,等离子清洗机源头厂家数量逐渐增多,行业内也出现了诸多问题。部分…

新手做网站最简单流程如何做网站标题不含关键词的排名

按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种…

如何做中国古城的网站wordpress 页眉

禅道的基本使用一、创建项目二、创建维护部门三、添加用户四、创建产品五、提出需求六、创建测试用例禅道作为一个缺陷的管理工具&#xff0c;对于测试者来说其必不可少&#xff0c;下面将介绍禅道的基本使用 一、创建项目 登录禅道&#xff0c;点击项目&#xff0c;创建一个…