社区讨论

z函数 48pts tle

P7114[NOIP2020] 字符串匹配参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjst94z
此快照首次捕获于
2025/11/04 07:56
4 个月前
此快照最后确认于
2025/11/04 07:56
4 个月前
查看原帖
如题。
CPP
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int maxn = 1e6 + 500;
int z[maxn], n; string s;
void exkmp() {
	int l = 0, r = 0;
	for (int i = 1; i <= n; ++i) {
		z[i] = 0;
		if (i <= r) z[i] = min(r - i + 1, z[i - l + 1]);
		for (; i + z[i] <= n && s[i + z[i]] == s[1 + z[i]]; ++z[i]);
		if (i + z[i] - 1 > r) l = i, r = i + z[i] - 1;
	}
	for (int i = 1; i <= n; ++i) {
		z[i] = min(z[i], n - i);
	}
}
int cp[26], cs[26];
struct BIT {
	int c[30], lim = 26;
	int lowbit(int x) {return x & (-x);}
	void add(int pos, int delta) {
		for (; pos <= lim; pos += lowbit(pos)) c[pos] += delta;
	}
	int query(int pos) {
		int res = 0;
		for (; pos; pos -= lowbit(pos)) res += c[pos];
		return res;
	}
} bit;
void clear() {
	memset(cp, 0, sizeof cp);
	memset(cs, 0, sizeof cs);
	memset(bit.c, 0, sizeof bit.c);
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
	int T; cin >> T;
	while (T--) {
		cin >> s;
		n = s.size();
		s = " " + s;
		exkmp();
		int tot = 0, fp = 0, fs = 0;
		clear();
		for (int i = 1; i <= n; ++i) ++cs[s[i] - 'a'];
		for (int i = 0; i < 26; ++i) tot += (cs[i] & 1);
		fs = tot;
		int ans = 0;
		for (int i = 1; i < n; ++i) {
			if (++cp[s[i] - 'a'] & 1) ++fp;
			else --fp;
			if (--cs[s[i] - 'a'] & 1) ++fs;
			else --fs;
			if (i > 1) {
				int x = 1 + z[i + 1] / i;
				ans += (x / 2 + (x & 1)) * bit.query(fs + 1) + (x / 2) * bit.query(tot + 1);
			}
			bit.add(fp + 1, 1);
		}
		cout << ans << endl;
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...