RT 样例过了,提交 2 个 WA8 个 RE
Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
#define lpos pos << 1
#define rpos pos << 1 | 1
using namespace std;
const int MAXN = 1e6 + 5;
int n, ans;
char s1[MAXN], s2[MAXN];
int p[100][MAXN], cnt[100], a[MAXN];
struct tree
{
int l, r, val;
}t[MAXN << 2];
void pushup(int pos)
{
t[pos].val = t[lpos].val + t[rpos].val;
}
inline void build(int pos, int l, int r)
{
t[pos].l = l, t[pos].r = r;
if (l == r)
{
return;
}
int mid = (l + r) >> 1;
build(lpos, l, mid);
build(rpos, mid + 1, r);
}
inline void update(int pos, int dis)
{
int l = t[pos].l, r = t[pos].r;
if (l == r)
{
t[pos].val++;
return;
}
int mid = (l + r) >> 1;
if (dis <= mid)
{
update(lpos, dis);
}
else
{
update(rpos, dis);
}
pushup(pos);
}
inline int query(int pos, int L, int R)
{
int l = t[pos].l, r = t[pos].r;
if (l >= L && r <= R)
{
return t[pos].val;
}
int mid = (l + r) >> 1, res;
if (L <= mid)
{
res = query(lpos, L, R);
}
if (R > mid)
{
res += query(rpos, L, R);
}
return res;
}
signed main()
{
scanf("%lld%s%s", &n, &s1, &s2);
for (int i = 0; i < n; i++)
{
p[s1[i] - 'A'][++cnt[s1[i] - 'A']] = i + 1;
}
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < n; i++)
{
a[i + 1] = p[s2[i] - 'A'][++cnt[s2[i]] - 'A'];
}
for (int i = 1; i <= n; i++)
{
// ans += query(1, 1, a[i]);
ans += i - 1 - query(1, 1, a[i]);
update(1, a[i]);
}
printf("%lld", ans);
return 0;
}