MnZn 25 pts 超短代码求助
查看原帖
MnZn 25 pts 超短代码求助
553245
Hansitory楼主2023/11/8 21:26
#include <bits/stdc++.h>

const int N = 2e6 + 5;
int n, head[N]; // head 表示以该字符结尾的最短可消除字符串的首位 
long long ans, res[N]; // res 表示以该字符结尾的可消除字符串数量 
char s[N];

int main() {
	scanf("%d%s", &n, s + 1);
	for (int i = 2; i <= n; i++) {
		if (s[i - 1] == s[i]) { // 与前一字符配对 
			head[i] = i - 1;
			res[i] += res[i - 2] + 1;
		} else if (head[i - 1] > 1 && s[head[i - 1] - 1] == s[i]) { // 带上前一字符可配对
			head[i] = head[i - 1] - 1;
			res[i] += res[head[i - 1] - 2] + 1;
		}
	}
	
	for (int i = 1; i <= n; i++) {
		ans += res[i];
	}
	printf("%lld\n", ans);
	return 0;	
}

如题,题目为 CSP-S 2023 T2,上述代码在 nn 较大时答案误差也较大,求教哪里有考虑不周的地方…

2023/11/8 21:26
加载中...