Sort§
用前缀和维护区间信息。
对于任意一次询问,我们获得的区间值是这个区间下两个字符串中某个字母数量的差。
如果为
0意味着不需要额外的操作就能让这个字母合法,也就意味着这个字母所在的位置两两对应。不为
0则意味着这些位置需要进行匹配。把所有需要操作的位置统计出来,并除以
2。这个值实际上应该是两个字符串不匹配位置的数量和,当然你可以只统计正数和或者负数和,很显然它们的绝对值是相等的。
#include <bits/stdc++.h> void solve() { int n, q; std::cin >> n >> q; std::string a, b; std::vector c(n + 1, std::vector<int>(26, 0)); std::cin >> a >> b; for (int i = 0; i < n; i++) { c[i + 1][a[i] - 'a'] += 1; c[i + 1][b[i] - 'a'] -= 1; for (int j = 0; j < 26; j++) { c[i + 1][j] += c[i][j]; } } while (q--) { int l, r; std::cin >> l >> r; int ans = 0; for (int i = 0; i < 26; i++) { ans += abs(c[r][i] - c[l - 1][i]); } std::cout << ans / 2 << '\n'; } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t; std::cin >> t; while (t--) { solve(); } return 0; }