ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ARC099F题解

2022-08-23 09:00:33  阅读:103  来源: 互联网

标签:p2 mod1 mod2 p1 int 题解 ARC099F id


被杀了,记录一下好了。

对于他那个数组是否相等,直接判断复杂度很高,考虑通过哈希映射之后判断是否相等。

对数组的 Hash 可以类似字符串 Hash那样去做。

于是判断一个区间是否和整个串相同就是 \(\frac{S[R]-S[L-1]}{p^{id[L-1]}}=S[n]\),其中 \(id\) 是指针的偏移量,\(S\) 是执行前缀之后得到的数组的 Hash 值。

开个 map 直接做就好了。然后这题卡单哈希要写双哈希。

#include<utility>
#include<cstdio>
#include<map>
typedef std::pair<int,int> pr;
const int M=250005,mod1=2053075307,mod2=1926195307;
int n,S1[M],S2[M],_P1[M<<1],_P2[M<<1],*p1=_P1+M,*p2=_P2+M,id[M];char t[M];std::map<pr,int>CB;
signed main(){
	long long ans(0);scanf("%d%s",&n,t+1);p1[0]=p2[0]=1;
	for(int i=1;i<=n;++i){
		id[i]=id[i-1]+(t[i]=='<'?-1:t[i]=='>'?1:0);
		p1[i]=13331ll*p1[i-1]%mod1;p1[-i]=1814363528ll*p1[-i+1]%mod1;
		S1[i]=(1u*S1[i-1]+(t[i]=='+'?p1[id[i]]:t[i]=='-'?mod1-p1[id[i]]:0))%mod1;
		p2[i]=13331ll*p2[i-1]%mod2;p2[-i]=335939096ll*p2[-i+1]%mod2;
		S2[i]=(1u*S2[i-1]+(t[i]=='+'?p2[id[i]]:t[i]=='-'?mod2-p2[id[i]]:0))%mod2;
	}
	const int s1=S1[n],s2=S2[n];++CB[pr(s1,s2)];
	for(int i=1;i<=n;++i){
		ans+=CB[pr(S1[i],S2[i])];++CB[pr((1ll*s1*p1[id[i]]+S1[i])%mod1,(1ll*s2*p2[id[i]]+S2[i])%mod2)];
	}
	printf("%lld",ans);
}

标签:p2,mod1,mod2,p1,int,题解,ARC099F,id
来源: https://www.cnblogs.com/lmpp/p/16614912.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有