字符串算法(算法竞赛)--最小表示法与最详细的字符串哈希

1、B站视频链接:F01 最小表示法_哔哩哔哩_bilibili

题目链接:【模板】最小表示法 - 洛谷

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=7e5;
int n;
int s[N];

int get_min(){
	for(int i=1;i<=n;i++)s[n+i]=s[i];//字符串复制一倍
	int i=1,j=2,k=0;
	while(i<=n&&j<=n){
		for(k=0;k<n&&s[i+k]==s[j+k];k++);//相等则向后扫描
		s[i+k]>s[j+k]?i=i+k+1:j=j+k+1;//跳过被淘汰的那段
		if(i==j)j++;//相等了则让i,j其中之一向后加一位 
	} 
	return min(i,j);//返回最小指针的位置 
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&s[i]);
	int k=get_min();
	for(int i=0;i<n;i++){
		printf("%d ",s[k+i]);
	}
	return 0;
}

2、B站视频链接:F02 字符串哈希_哔哩哔哩_bilibili

题目链接:【模板】字符串哈希 - 洛谷

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
int n,m;
const int N=1000010,P=131;
char s[N];
ULL p[N],h[N];//p[i]=p^i即p的i次方,h[i]是s[1~i]的hash值
 
//预处理hash函数的前缀和
void init(){
	p[0]=1,h[0]=0;
	for(int i=1;i<=n;i++){
		p[i]=p[i-1]*P;
		h[i]=h[i-1]*P+s[i];
	}
} 
//计算s[l~r]的hash值,求区间和 
ULL get(int l,int r){
	return h[r]-h[l-1]*p[r-l+1];
}
//判断两子串是否相等
bool substr(int l1,int r1,int l2,int r2){
	return get(l1,r1)==get(l2,r2);
}
int main(){
	cin>>n>>m;
	scanf("%s",s+1);
	init();
	while(m--){
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		if(substr(a,b,c,d))puts("Yes");
		else puts("No");
	}
	return  0;
}
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=10010;
int n,m;
char s[N];
typedef unsigned long long ULL;
const int P=131;
ULL h[N],ans[N];

//计算每个字符串的哈希值
ULL calc(char *s,int n){
	h[0]=0;
	for(int i=1;i<=n;i++){
		h[i]=h[i-1]*P+s[i];
	}
	return h[n];//前缀和 
} 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%s",s+1);
		int m=strlen(s+1);//计算字符串的长度 
		ans[i]=calc(s,m);
	}
	sort(ans+1,ans+n+1);//将所有哈希值排成升序,提高比较的效率 
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(ans[i]!=ans[i-1])++cnt;
	}
	printf("%d",cnt);
	return 0;
}
相关推荐
J先生x1 小时前
【IP101】图像处理进阶:从直方图均衡化到伽马变换,全面掌握图像增强技术
图像处理·人工智能·学习·算法·计算机视觉
ErikTse_2 小时前
【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门
职场和发展·蓝桥杯
爱coding的橙子3 小时前
每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)
算法·leetcode
嗨信奥4 小时前
蓝桥杯青少 图形化编程(Scratch)每日一练——校门外的树
青少年编程·蓝桥杯
虾球xz5 小时前
游戏引擎学习第268天:合并调试链表与分组
c++·学习·链表·游戏引擎
fpcc5 小时前
跟我学c++高级篇——模板元编程之十三处理逻辑
c++
格林威6 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
Dream it possible!7 小时前
LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
c++·leetcode·位运算·哈希表·哈希集合
?abc!8 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存
BioRunYiXue8 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学