这样写Hash为什么只有25分?
查看原帖
这样写Hash为什么只有25分?
999274
CNS_5t0_0r2楼主2024/4/11 13:52
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N = 2e6 + 9,P = 13331;
int n;
char s[N];
int pow_P[N],stk_Hash;
stack<int>stk;
map<int,int>Hash;
int ans;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n;
	cin >> (s + 1);
	Hash[0]++;
	stk.push(1);
	stk_Hash = s[1];
	Hash[stk_Hash]++;
	for(int i = 2;i <= n;i++){
		if(stk.empty()){
			stk.push(i);
			stk_Hash = (stk_Hash * P) + s[i];
		}
		else if(s[i] == s[stk.top()]){
			stk.pop();
			if(stk.empty())
				stk_Hash = 0;
			else
				stk_Hash = (stk_Hash - s[stk.top()]) / P;
		}
		else{
			stk.push(i);
			stk_Hash = (stk_Hash * P) + s[i];
		}
		int cnt = Hash[stk_Hash];
		ans -= (cnt * (cnt - 1) >> 1);
		cnt++;Hash[stk_Hash]++;
		ans += (cnt * (cnt - 1) >> 1);
	}
	cout << ans;
	return 0;
}
2024/4/11 13:52
加载中...