这道题做的并不算好,因为花了太长时间来思考了,思路偏了好几次。
对于这道题,稍微一思考就知道需要我们做的是:确定每次给出的范围内两个字符串中存在的字符有多少不相同的。
并且也应该确定这道题每次操作是独立的,也就是说你不能够确定一个总的范围来直接全局操作。但是每次直接从询问中进行操作一定是不可能的,所以我们必须想出一个预处理的方法,在预处理之后能够实现每次给出一个范围我们都能知道a和b之间有多少个字母是不一样的。
那么我们只需要建立两个二维前缀和数组,分别记录a和b的26个字母前缀和,并且每次在查询的时候进行26次循环,一定不会超时了。
看代码就能够理解了:
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
const int N = 2e5 + 10;
char a[N];
char b[N];
int sa[N][26];
int sb[N][26];
void solve()
{
int n,q;
cin >> n >> q;
scanf("%s",a+1);
scanf("%s",b+1);
for(int i = 1;i <= n;i++){
for(int j = 0;j < 26;j++){
sa[i][j] = sa[i-1][j] + ((a[i] - 'a') == j);
sb[i][j] = sb[i-1][j] + ((b[i] - 'a') == j);
}
}
while(q--){
int l,r;
cin >> l >> r;
int res = 0;
for(int i = 0;i < 26;i++){
res += abs(sa[r][i] - sa[l-1][i] - sb[r][i] + sb[l-1][i]);
}
cout << res/2 << endl;
//由于只需要操作一个,记得将操作数除以2
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
solve();
}
return 0;
}