双哈希求改
查看原帖
双哈希求改
1010953
ctyctyctycty楼主2024/10/20 15:21
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+10;
const int MOD=1e9+7;
const int base1=151,base2=131;
ll pow1[N],pow2[N],ha1[N],ha2[N];
char a[N],st[N];
int main()
{
	int n;
	pow1[0]=1;
	pow2[0]=1;
	for(int i=1;i<=2e6;i++)
	{
		pow1[i]=pow1[i-1]*base1%MOD;
		pow2[i]=pow2[i-1]*base2%MOD;
	}
	scanf("%d%s",&n,a+1);
	map<pair<ll,ll>,int> mp;
	mp[make_pair(ha1[0],ha2[0])]++;
	ll ans=0;
	int tot=0;
	for(int i=1;i<=n;i++)
	{
		if(st[tot]==a[i])
		{
			ha1[i]=(ha1[i-1]-a[i]*pow1[tot]%MOD+MOD)%MOD;
			ha2[i]=(ha2[i-1]-a[i]*pow2[tot]%MOD+MOD)%MOD;
		}
		else 
		{
			tot++;
			st[tot]=a[i];
			ha1[i]=(ha1[i-1]+a[i]*pow1[tot])%MOD;
			ha2[i]=(ha2[i-1]+a[i]*pow2[tot])%MOD;
		}
		ans+=mp[make_pair(ha1[i],ha2[i])];
		mp[make_pair(ha1[i],ha2[i])]++;
	}
	cout<<ans;
	return 0;
}
2024/10/20 15:21
加载中...