题目链接:题目
大意:
给出两个字符串,查询 n n n次,每次查询区间 [ l , r ] [l,r] [l,r]的含有的不同字符个数。
思路:
一看到有多次查询某个区间的操作,就想到前缀和,问题是如何存储。一开始我存储从 0 0 0到 i i i不同字符个数,但实际上是不对的,前缀和能够直接存储总和,因为总和只看这个数字,而与具体这个总和包含了哪些数字无关,而不同字符个数就不一样。所以我们是存储每个字符的差异数,然后查询的时候再计算总的差异数。并且由于最多只有26种字母,所以时间和空间复杂度不会太高。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n,q;
cin >> n >> q;
string a,b;
cin >>a >> b;
vector<std::array<int,26> > qzh(n+1);
for(int i = 0 ; i < n ; i ++) {
qzh[i+1] = qzh[i];
qzh[i+1][a[i]-'a']++;
qzh[i+1][b[i]-'a']--;
}
for(int i = 0 ; i < q ; i ++) {
int l,f;
cin >> l >> f;
l--;
int ans = 0;
for(int j = 0 ; j < 26 ; j ++) {
ans += std::max(qzh[f][j] - qzh[l][j],(int)0);
}
cout << ans << "\n";
}
}
signed main(){
int t=1;
cin >> t;
while(t--){
solve();
}
return 0;
}