社区讨论
暴力过题
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 条回复,欢迎继续交流。
正在加载回复...