S T2哈希60pts求助
  • 板块学术版
  • 楼主GoldenFishX
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/10/21 23:39
  • 上次更新2023/11/2 12:03:52
查看原帖
S T2哈希60pts求助
156353
GoldenFishX楼主2023/10/21 23:39

rt

#include <bits/stdc++.h>
#include <map>

using namespace std;

const int MAXN = 2e6 + 5;
const int MAXlN = 8002;

int n;
string s;

struct Node {
	char a[MAXlN];
	int cnt;
} a[MAXlN];

char stk[MAXN];

bool check(int l, int r) {
	++r;
	if (a[l].cnt != a[r].cnt) return 0;
	for (int i = 0; i <= a[l].cnt; ++i) {
		if (a[l].a[i] != a[r].a[i]) return 0;
	}
	return 1;
}

int main() {
	// freopen("game.in", "r", stdin);
	// freopen("game.out", "w", stdout);
	ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> s;
	if (n <= 8000) {
//	if (0) {
		int ans = 0;
		a[0].cnt = -1;
		a[1].cnt = -1;
		for (int i = 1; i <= n; ++i) {
			if (i > 0) {
				a[i].cnt = a[i - 1].cnt;
				for (int j = 0; j <= a[i].cnt; ++j) {
					a[i].a[j] = a[i - 1].a[j];
				}
			}
			if (a[i].cnt > -1 && a[i].a[a[i].cnt] == s[i - 1]) {
				--a[i].cnt;
			} else {
				a[i].a[++a[i].cnt] = s[i - 1];
			}
		}
		a[n + 1].cnt = a[n].cnt;
		for (int i = 0; i <= a[n].cnt; ++i) {
			a[n + 1].a[i] = a[n].a[i];
		}
		
		for (int l = 0; l < n; ++l) {
			for (int r = l + 1; r < n; ++r) {
				if (check(l, r)) {
					++ans;
				}
			}
		}
		cout << ans;
	} else {
		long long ans = 0;
		map<__uint128_t, int> f;
		int cnt = -1;
		__uint128_t sum = 0;
		pair<__uint128_t, int> p;
		p.first = 0, p.second = 1;
		f.insert(p);
		for (int i = 0; i < n; ++i) {
			if (cnt > -1 && stk[cnt] == s[i]) {
				--cnt;
				sum /= 27;
			} else {
				stk[++cnt] = s[i];
				sum = sum * 27 + (s[i] - 'a' + 1);
			}
			if (f.find(sum) != f.end()) {
				ans += f[sum];
				++f[sum];
			} else {
				p.first = sum, p.second = 1;
				f.insert(p);
			}
		}
		cout << ans;
	}
	
	return 0;
}

2023/10/21 23:39
加载中...