题意:
给两个字符串 a 和 b ,不断右移 b 字符串,并将 b 代表的二进制数与 a 代表的二进制数相与运算结果累加,注意对累加结果对 998244353 取模
思路:
使得 a 字符串和 b 字符串长度相等,此处有技巧。在预处理关于 a 对应位置后缀 1 的数量 hz[ x ] ,并求得这些二进制 1 所对应的十进制数的和 用数组 num 存储。然后遍历 b 字符串串,如果遇到 1 ,则让答案 res 加上此位置后缀 1 数目 x 对应的 num[ x ]
int f[N] = { 0 };//存放各种2的幂
int const mod = 998244353;
int main()
{
int n, m; cin >> n >> m;
string s, t; cin >> s >> t;
vector<int> hz(max(n, m) + 1);
int cnt = 0;
vector<int> num(N);
f[0] = 1;
for (int i = 1; i < n; i++)
f[i] = (f[i - 1] * 2) % mod;
for (int i = n-1; i >= 0; i--){
if (s[i] == '1')
cnt++, num[cnt] = (num[cnt - 1] + f[n - 1 - i]) % mod;
}
cnt = 0;
int k = n - 1;
for (int i = m-1;i>=0; i--,k--){
if (k<0){
hz[i] = hz[i + 1];continue;
}
if (s[k] == '1')cnt++;
hz[i] = cnt;
}
int res = 0;
for (int i = 0; i < m; i++){
if (t[i] == '1'){
res = (res + num[hz[i]]) % mod;
}
}
cout << res;
return 0;
}