CF1849C Binary String Copying 题解
思路
哈希判重。
因为只有
为了方便求出区间排序后的哈希值,可以不直接记录哈希值,而是记录
对于每次操作可以把整个序列分成四段:
整个序列的哈希值为
代码
#include <bits/stdc++.h>
using namespace std;
int t, n, m, ans, s[200005];
unsigned long long p[200005], hs[200005], hs1[200005];
char c;
unordered_map<unsigned long long, bool> flag;
int main() {
cin >> t;
p[0] = 1;
for (int i = 1; i <= 2e5; i++)
p[i] = p[i - 1] * 131;
while (t--) {
cin >> n >> m;
flag.clear(), ans = 0, c = '$';
while (c != '0' && c != '1')
c = getchar();
for (int i = 1; i <= n; i++) {
s[i] = s[i - 1] + c - '0';
hs[i] = hs[i - 1] + (c - '0') * p[n - i];
c = getchar();
}
for (int i = 1; i <= n; i++)
hs1[i] = hs1[i - 1] + p[n - i];
while (m--) {
int l, r;
unsigned long long hsh, cnt0, cnt1;
cin >> l >> r;
cnt1 = s[r] - s[l - 1], cnt0 = r - l + 1 - cnt1;
hsh = hs[l - 1] + hs1[r] - hs1[l + cnt0 - 1] + hs[n] - hs[r];
if (!flag[hsh])
ans++, flag[hsh] = 1;
}
cout << ans << '\n';
}
return 0;
}