比赛时并没有搞出来qwq
题目中的两种变换可以当作是字符
观察到
0 的个数相等;- 第
i 个0 在这两个子串中的下标奇偶性对应相同。
于是我们只需要对
代码:
#include <cstdio>
const int MAXN=220000;
const int BASE=19260817;
const int MOD=1004535809;
char a[MAXN];
int powb[MAXN];
int cnt[MAXN], h1[MAXN], h2[MAXN];
inline int query(int l, int r)
{
if (l&1) return (h1[r]-1ll*h1[l-1]*powb[cnt[r]-cnt[l-1]]%MOD+MOD)%MOD;
else return (h2[r]-1ll*h2[l-1]*powb[cnt[r]-cnt[l-1]]%MOD+MOD)%MOD;
}
int main()
{
// freopen("D.in", "r", stdin);
// freopen("D.out", "w", stdout);
int n, q;
scanf("%d%s", &n, a+1);
powb[0]=1;
for (int i=1; i<=n; i++)
{
powb[i]=1ll*powb[i-1]*BASE%MOD;
cnt[i]=cnt[i-1]+(a[i]=='0');
if (a[i]=='0')
{
h1[i]=(1ll*h1[i-1]*BASE+(i&1)+1)%MOD;
h2[i]=(1ll*h2[i-1]*BASE+(i&1^1)+1)%MOD;
}
else h1[i]=h1[i-1], h2[i]=h2[i-1];
}
scanf("%d", &q);
while (q--)
{
int l, r, len;
scanf("%d%d%d", &l, &r, &len);
if (query(l, l+len-1)==query(r, r+len-1)) puts("Yes");
else puts("No");
}
return 0;
}