P8908 [USACO22DEC] Palindromes P 题解
P8908 [USACO22DEC] Palindromes P 题解
算是好题,虽然没什么人做(
简单地,我们考虑如何将一个字符串改变为回文串。显然如果我们判定所有
那么由这类题的套路不难知道最优的变换一定不改变
具体地,对于一个长度为
考虑优化这个过程。我们发现
实现的时候注意中点唯一时中点位置固定且不计入
题目的关键是发现
代码:
#include <bits/stdc++.h>
#define N 7505
using namespace std;
int n;
string s;
int a[N];
struct BIT {
int lowbit(int x) {
return x & (-x);
}
#define M 15005
int tree[M];
void add(int x, int v) {
while (x < M) {
tree[x] += v;
x += lowbit(x);
}
}
int ask(int x) {
int ans = 0;
while (x) {
ans += tree[x];
x -= lowbit(x);
}
return ans;
}
void clear() {
memset(tree, 0, sizeof tree);
}
} A, B;
int g[N], cnt;
int sum[N], sm[N];
long long ans;
int main() {
cin >> s;
n = s.size();
s = " " + s;
for (int i = 1; i <= n; i++) {
if (s[i] == 'G') {
a[i] = 1;
g[++cnt] = i;
}
else
++sm[i];
sm[i] += sm[i - 1];
sum[i] = sum[i - 1] + a[i];
}
g[cnt + 1] = n + 1;
for (int mid = 1; mid <= cnt; mid++) {
for (int j = 0; mid - j >= 1 && mid + j <= cnt; j++) {
int L = g[mid - j - 1] + 1, R = g[mid + j + 1] - 1;
int tmp = g[mid - j] + g[mid + j];
if (j) {
A.add(tmp, tmp);
B.add(tmp, 1);
}
for (int l = L; l <= g[mid - j]; l++)
for (int r = g[mid + j]; r <= R; r++) {
if ((r - l + 1) % 2 == 0)
continue;
int tmp = l + r;
int num = B.ask(tmp), as = A.ask(tmp);
ans += tmp * num - as
num = B.ask(M - 1) - B.ask(tmp), as = A.ask(M - 1) - A.ask(tmp);
ans += as - tmp * num;
ans += abs((tmp >> 1) - g[mid]);
}
}
A.clear();
B.clear();
}
for (int mid = 1; mid <= cnt; mid++) {
for (int j = 0; mid - j >= 1 && mid + 1 + j <= cnt; j++) {
int L = g[mid - j - 1] + 1, R = g[mid + j + 2] - 1;
int tmp = g[mid - j] + g[mid + j + 1];
A.add(tmp, tmp);
B.add(tmp, 1);
for (int l = L; l <= g[mid - j]; l++)
for (int r = g[mid + j + 1]; r <= R; r++) {
int tmp = l + r;
int num = B.ask(tmp), as = A.ask(tmp);
ans += tmp * num - as;
num = B.ask(M - 1) - B.ask(tmp), as = A.ask(M - 1) - A.ask(tmp);
ans += as - tmp * num;
}
}
A.clear();
B.clear();
}
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
if (((sum[j] - sum[i - 1]) & 1) && ((sm[j] - sm[i - 1]) & 1))
--ans;
cout << ans << "\n";
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!