其他分享
首页 > 其他分享> > ARC099F题解

ARC099F题解

作者:互联网

被杀了,记录一下好了。

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

对数组的 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