题解 CF1658F
思路
脑筋急转弯,为什么不是 div.2 C 呢。
记字符串有
抛出一个重磅结论:我们把最后一个字符和第一个字符连起来,形成一个环,环上一定存在一个长度为
证明:如果每个区间价值和都
于是答案不超过
别忘了特判一个串里要有小数个
代码
signed main()
{
for(int T=read();T--;)
{
int n=read(),m=read();
scanf("%s",s+1);
int c0=0;
for(int i=1; i<=n; ++i) c0+=s[i]=='1';
if((m*c0)%n)
{
puts("-1");
continue;
}
for(int i=1; i<=n; ++i)
a[i]=s[i]-48,a[n+i]=s[i]-48;
int N=n<<1;
for(int i=1; i<=N; ++i) if(a[i]) a[i]=n-c0; else a[i]=-c0;
for(int i=1; i<=N; ++i) a[i]+=a[i-1];
int l=0,r=0;
for(int i=m; i<=N; ++i)
if(a[i-m]==a[i])
{
l=i-m+1,r=i;
break;
}
assert(l);
if(r<=n) puts("1"),printf("%lld %lld\n",l,r);
else puts("2"),printf("%lld %lld\n",1ll,r-n),printf("%lld %lld\n",l,n);
}
return 0;
}