#include<bits/stdc++.h>
void solve(int n, int q, char *s1, char *s2, int *q_x, int *q_y, int *q_len, unsigned *ans)
{
if (n <= 1e3)
for (int i = 0; i < q; i++)
{
int x = q_x[i], y = q_y[i], len = q_len[i];
ans[i] = 0;
for (int t = 0; t < len; t++, x++, y++)
ans[i] += ((s1[x] == '0' && s2[y] == '1') || (s1[x] == '1' && s2[y] == '2') ||
(s1[x] == '2' && s2[y] == '0')) ? 1 : 0;
}
else
{
for (int i = 0; i < q; i++)
ans[i] = 0;
{
int m = n - 64;
std::vector<std::bitset<64>> na(m), nb(m);
std::bitset<64> base;
for (int i = 0; i < 64; i++)
base[i] = s1[i] == '0';
na[0] = base;
for (int i = 1; i < m; i++)
{
base >>= 1;
base[63] = s1[i + 63] == '0';
na[i] = base;
}
for (int i = 0; i < 64; i++)
base[i] = s2[i] == '1';
nb[0] = base;
for (int i = 1; i < m; i++)
{
base >>= 1;
base[63] = s2[i + 63] == '1';
nb[i] = base;
}
for (int i = 0; i < q; i++)
{
int x = q_x[i], y = q_y[i], len = q_len[i];
if (len <= 63)
{
for (int j = 0; j < len; j++,x++,y++)
ans[i]+=(s1[x]=='0'&&s2[y]=='1');
}
else
{
while(len>63)
{
auto temp=na[x]&nb[y];
x+=64,y+=64;
len-=64;
ans[i]+=temp.count();
}
for (int j = 0; j < len; j++,x++,y++)
ans[i]+=(s1[x]=='0'&&s2[y]=='1');
}
}
}
{
int m = n - 64;
std::vector<std::bitset<64>> na(m), nb(m);
std::bitset<64> base;
for (int i = 0; i < 64; i++)
base[i] = s1[i] == '1';
na[0] = base;
for (int i = 1; i < m; i++)
{
base >>= 1;
base[63] = s1[i + 63] == '1';
na[i] = base;
}
for (int i = 0; i < 64; i++)
base[i] = s2[i] == '2';
nb[0] = base;
for (int i = 1; i < m; i++)
{
base >>= 1;
base[63] = s2[i + 63] == '2';
nb[i] = base;
}
for (int i = 0; i < q; i++)
{
int x = q_x[i], y = q_y[i], len = q_len[i];
if (len <= 63)
{
for (int j = 0; j < len; j++,x++,y++)
ans[i]+=(s1[x]=='1'&&s2[y]=='2');
}
else
{
while(len>63)
{
auto temp=na[x]&nb[y];
x+=64,y+=64;
len-=64;
ans[i]+=temp.count();
}
for (int j = 0; j < len; j++,x++,y++)
ans[i]+=(s1[x]=='1'&&s2[y]=='2');
}
}
}
{
int m = n - 64;
std::vector<std::bitset<64>> na(m), nb(m);
std::bitset<64> base;
for (int i = 0; i < 64; i++)
base[i] = s1[i] == '2';
na[0] = base;
for (int i = 1; i < m; i++)
{
base >>= 1;
base[63] = s1[i + 63] == '2';
na[i] = base;
}
for (int i = 0; i < 64; i++)
base[i] = s2[i] == '0';
nb[0] = base;
for (int i = 1; i < m; i++)
{
base >>= 1;
base[63] = s2[i + 63] == '0';
nb[i] = base;
}
for (int i = 0; i < q; i++)
{
int x = q_x[i], y = q_y[i], len = q_len[i];
if (len <= 63)
{
for (int j = 0; j < len; j++,x++,y++)
ans[i]+=(s1[x]=='2'&&s2[y]=='0');
}
else
{
while(len>63)
{
auto temp=na[x]&nb[y];
x+=64,y+=64;
len-=64;
ans[i]+=temp.count();
}
for (int j = 0; j < len; j++,x++,y++)
ans[i]+=(s1[x]=='2'&&s2[y]=='0');
}
}
}
}
}
Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
Testcase #1 | 443.17 us | 48 KB | Accepted | Score: 50 | 显示更多 |
Testcase #2 | 3 s | 9 MB + 768 KB | Time Limit Exceeded | Score: 0 | 显示更多 |