首页 > 其他分享 >loj 6095 花神的嘲讽计划 题解

loj 6095 花神的嘲讽计划 题解

时间:2024-01-25 21:33:32浏览次数:32  
标签:二分 ch loj 题解 int 哈希 ans 6095

题目

哈希记录每个 \(k\) 长度的串,询问的时候可以拿主席树或二分,这里说下二分。
将 \(n-k+1\) 个串从小到大排序,以哈希值为第一关键字,序号为第二关键字。
每次询问直接查找大于等于当前哈希值的位置即可,找到之后判断一下合不合法即可。
具体看代码:

#include<bits/stdc++.h>
typedef unsigned long long ull;
inline int read(){
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
const int N=1e5+10;
const ull P=133331;
int n,m,k,cnt,a[N],temp[N],len,q[30],root[N];
ull hash[N];
struct HASH{
	ull hs;int l;
}h[N];
inline ull qpow(ull a,ull b){
	ull ans=1;
	for(;b;b>>=1,a*=a)if(b&1)ans=ans*a;
	return ans;
}
inline bool cmp(HASH a,HASH b){if(a.hs==b.hs)return a.l<b.l;return a.hs<b.hs;}
int main(){
	// freopen("in.in","r",stdin),freopen("out.out","w",stdout);
	std::ios::sync_with_stdio(false);std::cin.tie(0),std::cout.tie(0);
	n=read(),m=read(),k=read();
	ull mul=qpow(P,k);
	for(int i=1;i<=n;++i)a[i]=read(),hash[i]=hash[i-1]*P+a[i];
	n=n-k+1;
	for(int i=1;i<=n;++i)
		h[i].l=i,h[i].hs=hash[i+k-1]-hash[i-1]*mul;
	std::stable_sort(h+1,h+n+1,cmp);
	for(int i=1;i<=m;++i){
		int l=read(),r=read()-k+1;
		HASH zc={0,l};
		for(int j=1;j<=k;++j)zc.hs=zc.hs*P+read();
		int pd=std::lower_bound(h+1,h+n+1,zc,cmp)-h;
		if(pd<=n&&h[pd].l<=r&&h[pd].hs==zc.hs)std::cout<<"No\n";
		else std::cout<<"Yes\n";
	}
}

写这个题解主要是因为有些思维定式了,一开始没读懂题意,看题解去了,发现有个二分的做法,因为老想着主席树,所以一眼不知道二分咋做,问了int_R他说这不一眼,然后我发现好像确实一眼,并且代码难度小多了。
学些数据结构导致把前面基础的东西忘了还是挺可怕的。故写篇题解提醒一下以后的自己,不要忘记之前的一些基础算法。

标签:二分,ch,loj,题解,int,哈希,ans,6095
From: https://www.cnblogs.com/Ishar-zdl/p/17988232

相关文章

  • P8659 [蓝桥杯 2017 国 A] 数组操作 题解
    题目链接:洛谷或者蓝桥杯或者C语言中文网几个OJ的AC记录:忘了哪个OJ的:洛谷:C语言中文网:蓝桥杯:emmmmmmm,好像每个OJ给的时限和空间还不一样,蓝桥杯官方还给了$3s$和$2G$,C语言中文网机子比较老可能,挺卡常的,开了个究极快读和指令集就过去了,也可以自己调下重构常数,偷懒......
  • P3355 骑士共存问题题解
    题目链接:P3355骑士共存问题-洛谷|计算机科学教育新生态(luogu.com.cn)题解:棋盘问题考虑黑白染色成为二分图后做。观察马的性质,可知一个点只能到一个异色点,所以,构造方案可以先将所有同色点放上马,再考虑有那些异色点不可以放置。方法一:网络流,时间复杂度为O(|E|min(|E|0.5......
  • P7900 [COCI2006-2007#2] SJECIŠTA_题解
    [COCI2006-2007#2]SJECIŠTA_题解rt我们来看一下题目描述考虑一个有$n$个顶点的凸多边形,且这个多边形没有任何三个(或以上)的对角线交于一点。这句话什么意思?当顶点为$n$的图形为正多边形时便有可能出现一个点是有三条线相交而构成的如图如图情况就有三个......
  • P9779_[HUSTFC 2023] 不定项选择题_题解
    rt题目有一道共n个选项的不定项选择题,它的答案至少包含一个选项,由于题目与选项的内容晦涩难懂,你打算通过尝试每一种可能的答案来通过这道题。初始时所有选项都没有被勾选,你可以执行任意次下述操作:勾选一个当前未被勾选的选项。取消勾选一个当前已被勾选的选项。当你......
  • P2045 方格取数加强版题解
    题目链接:P2045方格取数加强版-洛谷|计算机科学教育新生态(luogu.com.cn)题目:出一个n*n的矩阵,每一格有一个非负整数A{i,j}且A{i,j} <=10^3现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要......
  • CF349B Color the Fence 题解 贪心
    贪心题意:你一共有\(v\)元,给你数字\(1\)~\(9\)的价值,求出你能够买下的数字组成的最大数。思路首先,我们知道能够买下的数字个数越多,组成数字的位数就越多,结果自然就越大,那么,根据贪心策略,我们可以先全买价格最便宜的数字(相同价格时,自然买更大的)。参考代码:intv;cin>>v;......
  • CF467C George and Job 题解 DP 前缀和
    DP前缀和题目链接题意:给你一个长度为\(n\)的序列,让你从这个序列中挑选出\(k\)个长度为\(m\)的区间,并且任意区间不相交。使得选出的数之和最大,求出这个数。解法:很经典的DP模型,我们定义\(f_{i,j}\)表示从前\(i\)个数选出了\(j\)个区间可以取得的最大值,那么答案为:\(f_{n,k}\)。......
  • SNOI 2024 题解(坑:D1T3 D2T1 D2T2)
    树V图相同\(f(i)\)的点必然构成一个连通块,不然一定无解。每一个连通块中需要选出一个关键点,考虑相邻连通块是否合法,发现条件其实很很好判,就是两个交界点的距离需要满足某个大小关系,容易预处理后\(O(1)\)判,于是\(f_{u,x}\)表示\(u\)连通块内取\(x\)的方案数,DP即可。......
  • 关于php进行post出现500的超时问题解决办法
      最近搞个项目使用php进行post请求,时间长了就会出现500错误,ngnix报了个错误:upstreamtimedout(10060:Aconnectionattemptfailedbecausetheconnectedpartydidnotproperlyrespondafteraperiodoftime,orestablishedconnectionfailedbecauseconnected......
  • P1481魔族密码 题解(字典树)
    魔族密码题目背景风之子刚走进他的考场,就……花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花)风之子:我呕……(杀死人的眼神)快说题目!否则……-_-###题目描述花花:……咦好冷我们现在要解决的是魔族的密码问题(自我陶醉:搞不好魔族里面还会有人用密码给我和菜虫写情书咧,哦......