社区讨论

暴力过题

P4070[SDOI2016] 生成魔咒参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@m6ptgfdt
此快照首次捕获于
2025/02/04 09:43
去年
此快照最后确认于
2025/11/04 10:02
4 个月前
查看原帖
rt
https://www.luogu.com.cn/record/201219511
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int MAXN = 2e5 + 7;
char a[MAXN];

vector<int> sa;

bool check(int x, int y)
{
	if (x >= sa.size()) return true;
	x = sa[x];
	while (x && y && a[x] == a[y]) x--, y--;
	return a[x] > a[y];
}

int height(int idx)
{
	int l = 0, r = 0;
	if (idx) {
		int x = sa[idx - 1], y = sa[idx];
		while (x && y && a[x] == a[y]) x--, y--, l++;
	}
	if (idx != sa.size() - 1) {
		int x = sa[idx], y = sa[idx + 1];
		while (x && y && a[x] == a[y]) x--, y--, r++;
	}
	return max(l, r);
}

signed main()
{
	int n, ans = 0; cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		int l = 0, r = i;
		while (l < r)
		{
			int mid = l + r >> 1;
			if (check(mid, i)) r = mid;
			else l = mid + 1;
		}
		sa.insert(sa.begin() + l, i);
		ans += (i - height(l));
		cout << ans << '\n';
	}
}

回复

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

正在加载回复...