字符串_哈希
参考文章:
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) 区内排序案例…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
