字符串_哈希
参考文章:
E. Compress Words(字符串hash)_z听歌的小孩z的博客-CSDN博客
字符串哈希 - OI Wiki (oi-wiki.org)
板子:
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+50;
typedef long long ll;
const int mod=1e9+7;
typedef unsigned long long ull;
char s[N];
int n;
ll h[N],p[N],base=31;
void init(){p[0]=1;for(int i=1;i<=n;i++){h[i]=(h[i-1]*base%mod+s[i])%mod;p[i]=p[i-1]*base%mod;}
}
int get_v(int l,int r){return ((h[r]-h[l-1]*p[r-l+1]%mod)%mod+mod)%mod;
}int main(){scanf("%s",s+1);n=strlen(s+1);init();return 0;
}
/*
ll p[3][N],h[3][N];
ll mod[3]={100000007,998244353,100000009},base[3]={73,87,61};
*/
例题:
例1:2021_ICPC_山东 F- Birthday Cake - Codeforces(双哈希)
题解:
看一个字符串的前缀和后缀,如果这两个前后缀相等,就去查询这个字符串除去这个前后缀之后还剩下的部分是否出现过,然后统计出现次数的答案 ps 我们把所有串按照串的长度从小到大排个序,一定要排,不然aaaa,aa这个数据就可以卡掉。
/*eg:abcabcd l=7 j=3 r=l-j+1=5 前缀[1,3] 后缀[5,7]chk(1,3)==chk(5,7)chk(4,6)
*/
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+5;
typedef long long ll;
typedef pair<ll,ll> pi;
const ll mod1=1e9+7,mod2=1e9+9;string s[N];
char ss[N];
int n;
ll res;
bool cmp(string x,string y){return x.length()<y.length();
}
ll p1[N],p2[N],h1[N],h2[N],P=31;
void init(){p1[0]=p2[0]=1;for(int i=1;i<N;i++)p1[i]=p1[i-1]*P%mod1,p2[i]=p2[i-1]*P%mod2;
}void get_h(int n){for(int i=1;i<=n;i++){h1[i]=(h1[i-1]*P%mod1+ss[i])%mod1;h2[i]=(h2[i-1]*P%mod2+ss[i])%mod2;}
}
ll getv1(int l,int r){return (h1[r]-h1[l-1]*p1[r-l+1]%mod1+mod1)%mod1;
}
ll getv2(int l,int r){return (h2[r]-h2[l-1]*p2[r-l+1]%mod2+mod2)%mod2;
}
map<pi,int>mp;
int main(){init();scanf("%d",&n);for(int i=1;i<=n;i++)cin>>s[i];sort(s+1,s+1+n,cmp);for(int i=1;i<=n;i++){int len=s[i].length();for(int j=0;j<len;j++)ss[j+1]=s[i][j];get_h(len);//前缀==后缀for(int j=1;j<len-j+1;j++){//[1,j][r,len]int r=len-j+1;if(getv1(1,j)==getv1(r,len)&&getv2(1,j)==getv2(r,len)){//除去前后缀的部分 [j+1,r-1]res+=mp[{getv1(j+1,r-1),getv2(j+1,r-1)}];}}ll v1=getv1(1,len),v2=getv2(1,len);//printf("end");//printf("i:%d [1,%d] [%d,%d] res%d\n",i,j,r,len,res);//printf("v1 %lld v2 %lld\n",v1,v2);res+=mp[{v1,v2}];mp[{v1,v2}]++;//printf("i:%d [1,%d] [%d,%d] res%d\n",i,j,r,len,res);}printf("%lld",res);return 0;
}
例2:E - Compress Words- Codeforces(双哈希)
题解:从长到短枚举每一个单词的前缀,和前面的所有单词匹配
*单哈希会被卡
*必须和前面所有单词匹配,不能只和前一个单词匹配
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pi;
const ll mod[2]={100000007,100000009};int n,cnt;
char s[N],ss[N];ll h1[3][N],h2[3][N],p[3][N],P[3]={73,87,61};
int l1,l2;
inline void init(){p[0][0]=p[1][0]=p[2][0]=1;for(int k=0;k<2;k++)for(int i=1;i<N;i++)p[k][i]=(p[k][i-1]*P[k])%mod[k];
}
inline void geth(int n,int num){for(int j=0;j<num;j++)for(int i=1;i<=n;i++)h1[j][i]=((h1[j][i-1]*P[j])%mod[j]+s[i])%mod[j];
}inline ll getv2(int l,int r,int i){return ((h2[i][r]-(h2[i][l-1]*p[i][r-l+1])%mod[i])%mod[i]+mod[i])%mod[i];
}
int main(){init();scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",s+1);l1=strlen(s+1);//printf("i%d %s l1:%d\n",i,s+1,l1);geth(l1,2);int anj=1;//printf("l2:%d l1:%d l2-l1+1:%d\n",l2,l1,l2-l1+1);int j1=l1,j2=l2-l1+1;if(j2<1)j1+=j2-1,j2=1;for(;j1>0&&j2<=l2;j1--,j2++){//printf("[1,%d]%lld [%d,%d]%lld %lld %lld %lld %lld\n",j1,h1[0][j1],j2,l2,getv2(j2,l2,0),h1[1][j1],getv2(j2,l2,1),h1[2][j1],getv2(j2,l2,2));if(h1[0][j1]==getv2(j2,l2,0)&&h1[1][j1]==getv2(j2,l2,1)){anj=j1+1;//printf("anj %d\n",anj);break;}}int t=cnt;for(int j=anj;j<=l1;j++)ss[++cnt]=s[j];//printf("cnt%d %s\n",cnt,ss+1);for(int j=0;j<2;j++)for(int i=t;i<=cnt;i++)h2[j][i]=((h2[j][i-1]*P[j])%mod[j]+ss[i])%mod[j];l2=cnt;}printf("%s",ss+1);return 0;
}相关文章:
字符串_哈希
参考文章: E. Compress Words(字符串hash)_z听歌的小孩z的博客-CSDN博客 字符串哈希 - OI Wiki (oi-wiki.org) 板子: #include<bits/stdc.h> using namespace std; const int N2e450; typedef long long ll; const int mod1e97; typedef unsig…...
python 之enumerate()函数
文章目录 enumerate() 是 Python 中的一个内置函数,它用于在遍历可迭代对象(如列表、元组、字符串等)时同时获取每个元素的索引和值。这个函数非常有用,因为它允许您在迭代过程中轻松地访问元素的索引,而不需要手动维护…...
【LeetCode刷题(数据结构与算法)】:用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty) 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶 int pop() 移除并返回栈顶元素 int top() 返…...
“客户端到服务器的数据传递”和“服务器上的数据传递”这两种数据传递的方式的区别
“客户端到服务器的数据传递”和“服务器上的数据传递”这两种数据传递方式的主要区别如下: 数据的流动方向: 在“客户端到服务器的数据传递”中,数据是从客户端(如浏览器)流向服务器。在“服务器上的数据传递”中&…...
LCR 181 字符串中的单词反转
题目来源: leetcode题目,网址:LCR 181. 字符串中的单词反转 - 力扣(LeetCode) 解题思路: 倒叙遍历,获得每个单词的起始位置与终止位置,然后将每次遇到的单词插入结果中。 解题…...
百度OCR识别图片文本字符串——物联网上位机软件
一、开发背景 根据项目需求,我们需要完成LED显示屏实时显示歌词的效果。最优的方法是调用歌曲播放器的API获取歌词,但是由于这个开发资格不是很好申请,因此我们采用其他方案,即通过OCR识别获取歌词,并投射到LED显示屏上…...
JAVA学习(6)-全网最详细~
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
睿趣科技:未来抖音开网店还有前景吗
随着科技的快速发展,电商平台已经成为了人们生活中不可或缺的一部分。在中国,抖音作为一个短视频平台,近年来迅速崛起,吸引了大量的用户和商家。那么,在未来,抖音是否还能为商家提供一个有效的电商平台呢?…...
第六章 应用层 | 计算机网络(谢希仁 第八版)
文章目录 第六章 应用层6.1 域名系统DNS6.1.1 域名系统概述6.1.2 互联网的域名结构6.1.3 域名服务器 6.2 文件传送协议6.2.1 FTP概述6.2.2 FTP的基本工作原理6.2.3 简单文件传送协议TFTP 6.3 远程终端协议TELNET6.4 万维网www6.4.1 万维网概述6.4.2 统一资源定位符URL6.4.3 超文…...
c++ lambda 表达式
1. 简介 lambda(匿名函数)是C11引入的一种函数对象,它允许我们在需要函数的地方创建一个临时的、匿名的函数。lambda表达式表示一个可以执行的代码单元,可以理解为一个未命名的内联函数。Lambda函数可以用于简化代码、提高可读性…...
Go语言入门心法(七): 并发与通道
Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 一: go语言并发与通道...
前端组件封装:构建模块化、可维护和可重用的前端应用
前端组件封装:构建模块化、可维护和可重用的前端应用 前端开发领域的快速演进已经将前端应用的规模和复杂性提升到了一个新的水平。在这个背景下,前端组件封装成为了一项关键实践,旨在构建模块化、可维护和可重用的前端应用。在本文中&#…...
GPT绘制流程图咒语
【咒语】下面是我的一篇论文选取部分,为了让读者更好理解,我准备画一张图,请你阅读后为我设计一下这个图应该怎么画,更有说服力,更容易理解 论文片段: 多模态数据融合研究的基础在于有效的数据采集。首先&a…...
【扩散模型从原理到实战】Chapter1 扩散模型简介
文章目录 1.1 扩散模型的原理生成模型扩散过程DDPM的扩散过程前向过程反向过程优化目标 1.2 扩散模型的发展开始扩散:DDPM加速生成:采样器刷新记录:基于CLIP的多模态图像生成引爆网络:基于CLIP的多模态图像生成再次“出圈”&#…...
使用轮廓分数提升时间序列聚类的表现
我们将使用轮廓分数和一些距离指标来执行时间序列聚类实验,并且进行可视化 让我们看看下面的时间序列: 如果沿着y轴移动序列添加随机噪声,并随机化这些序列,那么它们几乎无法分辨,如下图所示-现在很难将时间序列列分组为簇: 上面…...
蔬菜水果生鲜配送团购商城小程序的作用是什么
蔬菜水果是人们生活所需品,从业者众多,无论小摊贩还是超市商场都有不少人每天光临,当然这些只是自然流量,在实际经营中,蔬菜水果商家还是面临着一些难题。 对蔬菜水果商家而言,线下门店是重要的࿰…...
金融用户实践|分布式存储支持数据仓库业务系统性能验证
作者:深耕行业的 SmartX 金融团队 闫海涛 估值是指对资产或负债的价值进行评估的过程,这对于投资决策具有重要意义。每个金融公司资管业务人员都期望能够实现实时的业务估值,快速获取最新的数据和指标,从而做出更明智的投资决策。…...
代码随想录二刷 Day41
509. 斐波那契数 这个题简单入门,注意下N小于等于1的情况就可以 class Solution { public:int fib(int n) {if (n < 1) return n; //这句不写的话test能过但是另外的过不了vector<int> result(n 1); //定义存放dp结果的数组,还要定义大小r…...
C++项目实战——基于多设计模式下的同步异步日志系统-⑪-日志器管理类与全局建造者类设计(单例模式)
文章目录 专栏导读日志器建造者类完善单例日志器管理类设计思想单例日志器管理类设计全局建造者类设计日志器类、建造者类整理日志器管理类测试 专栏导读 🌸作者简介:花想云 ,在读本科生一枚,C/C领域新星创作者,新星计…...
Hadoop3教程(十四):MapReduce中的排序
文章目录 (99)WritableComparable排序什么是排序什么时候需要排序排序有哪些分类如何实现自定义排序 (100)全排序案例案例需求思路分析实际代码 (101)二次排序案例(102) 区内排序案例…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
