首页 > 编程语言 >[题解][2021-2022年度国际大学生程序设计竞赛第10届陕西省程序设计竞赛] Hash

[题解][2021-2022年度国际大学生程序设计竞赛第10届陕西省程序设计竞赛] Hash

时间:2024-04-15 20:45:59浏览次数:26  
标签:竞赛 int 题解 29 long 哈希 ans 程序设计 mod

题目描述

给定字符串T,要求求字符串S,满足以下条件:

  • S是T的前缀
  • S和T运行某段代码的哈希值相同(代码见下)
  • T只包含小写字母
  • S和T的长度差不超过50

哈希代码:

//Language C++14
long long mod=5999993;
long long gethas(string s)
{
    long long ret=0;
    for (char c:s)
    ret=(ret*29+(c-'a'+1))%mod;
    return ret;
}

题解
先分析这段哈希代码。取的模数mod=5999993,位权值为29(相当于29进制)。
那么可以得到29^6约为mod*100,远大于mod。
设S的哈希值为X,将X左移六位的哈希值为Y。可以枚举一个i,使i倍mod+X=H+Y。
其中H是可以用六位小写字母表示的哈希值。
由于a-z可以表示1-26的所有数,对于29进制,只要每一位的数满足>0且<26即可用小写字母表示。
每次查询能够找到的概率为(26/29)^6 ,约等于0.51。玄学复杂度,但可以跑过。

代码

#include<bits/stdc++.h>
#define  int  long long
using namespace std;
const int mod=5999993;
int q_pow(int a,int x){
	int ans=1,base=a;
	while(x){
		if(x&1)(ans*=base)%=mod;
		(base*=base)%=mod;
		x>>=1;
	}
	return ans;
}
bool check(int x){
	int ans[10];
	int p=0;
	while(x){
		ans[++p]=x%29;
		x/=29;
		if(ans[p]<=0||ans[p]>26)return false;
	}
	if(p!=6)return false;
	for(int i=p;i>=1;i--)cout<<(char)('a'+ans[i]-1);
	cout<<"\n";
	return true;
}
signed main(){
	int t;
	cin>>t;
	while(t--){
		string s;
		cin>>s;
		cout<<s;
		int x=0,f=1;
		for(int i=s.length()-1;i>=0;i--)(x+=((int)(s[i]-'a'+1)*f))%=mod,(f*=29)%=mod;
		int y=x;
		int flag=0;
		while(1){
			(y=q_pow(29,6)*y)%=mod;
			for(int i=0;i<=100;i++){
				int delta=x+mod*i-y;
				if(check(delta)){
					flag=1;
					break;
				}
			}
			if(flag)break;
		} 
	}
} 

标签:竞赛,int,题解,29,long,哈希,ans,程序设计,mod
From: https://www.cnblogs.com/zwzww/p/18136864

相关文章

  • PGSQL 问题解决
    1服务无法启动 这里更改安装目录bin下面例如E:\WorkingSoftware\PostgreSql\16\bin更改权限,下面都改下 2  安装时提示database出错,就初始化下执行以下命令E:\WorkingSoftware\PostgreSql\16\bin\pg_ctl.exe-DE:\WorkingSoftware\PostgreSql\16\dat......
  • 2024小学组AHOI赛后题解
    观看建议调成浅色模式(右下角图标)写前扯一下这次省赛可谓是人才辈出啊。结束前一个半小时就交卷,可见这次考试的难度。后我问他们是不是很有信心AKXX:做了前两题,后两题崩溃了。。。好吧,其实第三题没那么难,不过AK的真没有,听说没有一个人做对。接下来带大家看看这几题。(记得,看......
  • CF1253F Cheap Robot 题解
    首先建立一个超级点\(S\),对于每一个可以充电的点\(u\)都建立一条从\(S\tou\)的边权为\(0\)的有向边。从这个超级点\(S\)开始跑一遍最短路算法,就可以得到每一个点\(u\)至少需要花费多少的电量才可以走到一个充电点。令\(D_i\)表示\(i\)号点最少花费多少可以到一个......
  • LlamaIndex 常见问题解答(FAQ)
     提示:如果您尚未完成,请安装LlamaIndex并完成起步教程。遇到不熟悉的术语时,请参考高层次概念部分。在这个章节中,我们将从您为起步示例编写的代码开始,展示您可能希望针对不同应用场景对其进行的常见定制方法:python fromllama_index.coreimportVectorStoreIndex,Simp......
  • P4383 林克卡特树 题解
    题意:给定带边权的树,要切掉\(k\)条边,再任意连上\(k\)条边权为\(0\)的边。问最优策略下得到的树的边权最大值。\(n,k\le3\times10^5\)。参考【问题转化】切掉\(k\)条边后会变成\(k+1\)个连通块,之后的连边一定会把这\(k+1\)个连通块的直径连起来。所以相当于问把......
  • [题解](A-G)Atcoder Educational DP Contest(更新中)
    AtcoderEducationalDPContest\(\textbf{A.Frog1}\)对于一块石头\(i(3\lei\leN)\),\(i-1\)和\(i-2\)均能到达。用\(f[i]\)表示跳到第\(i\)个石头用的最小体力消耗:\[f[i]=min(abs(h[i]-h[i-1])+f[i-1],abs(h[i]-h[i-2])+f[i-2])\qquadi\ge3\]时间复杂度\(O(n)\)。......
  • 华中农业大学第十三届程序设计竞赛 题解
    A-scx的散文诗句Solution正负分开来分别处理,按照绝对值从大到小排序,两两匹配注意:当没有\(0\)且正数和负数都为奇数,即最后剩下一个正数一个负数时,必须匹配Code#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;voidsolve(){intn;cin>......
  • [题解]P1629 邮递员送信
    好久不写图论题了,Dijkstra都花了好长时间捡起来……之前也没有接触过反图的概念。这个题算是我重拾图论知识以来的第一题了。__φ(..)P1629邮递员送信Dijkstra是单源最短路的算法。但这个题除了要求节点\(1\)到其他节点的距离,还要知道其他节点回到节点\(1\)的距离。如果我们每个......
  • [POI2012] Rendezvous 题解
    众所周知,\(lyh\)是一名压行大师,也是一名\(juruo\),所以他将他繁琐的方法用\(102\)行表现了出来……明显原题为基环内向树森林。首先用并查集计算连通块,不在一个连通块里的答案就是\(-1\-1\)。发现实际上答案就是以环为根节点,求\(lca\)的结果,求完后可以分为两种情况:根......
  • [ABC349] AtCoder Beginner Contest 349 题解
    [ABC349]AtCoderBeginnerContest349题解目录[ABC349]AtCoderBeginnerContest349题解A-ZeroSumGameB-CommencementC-AirportCodeD-DivideIntervalE-WeightedTic-Tac-ToeF-SubsequenceLCMG-PalindromeConstruction总结A-ZeroSumGame零和博弈,......