#CF1930D2. 所有子串的和(困难版)

所有子串的和(困难版)

所有子串的和(困难版)

  • 时间限制:2 秒
  • 内存限制:512 MiB

题目描述

对于一个二进制模式 pp 和一个同长度二进制串 qq,若对 pp 的每个位置 ii,都能找到包含 ii 的一个区间,使得 pip_i 是 qq 在该区间中的众数,则称 qq 是 pp-good 的。一个字符在某串中出现次数不少于串长的一半(向上取整)时,它是该串的众数。

记 f(p)f(p) 为所有 pp-good 二进制串中字符 1 数量的最小值。

给定长度为 nn 的二进制串 ss,求

∑1≤i≤j≤nf(sisi+1⋯sj).\sum_{1\le i\le j\le n} f(s_i s_{i+1}\cdots s_j).

输入格式

第一行一个整数 tt,表示测试用例数。

每组测试先输入整数 nn,下一行输入长度为 nn、仅含 0 和 1 的字符串 ss。

保证 1≤t≤1051\le t\le 10^5,1≤n≤1061\le n\le 10^6,且所有测试用例的 nn 之和不超过 10610^6。

输出格式

对每组测试输出一个整数,表示答案。

样例输入

4
1
1
2
10
5
00000
20
11110110000000111111

样例输出

1
2
0
346

数据范围

对于所有数据,保证 1≤t≤1051\le t\le 10^5,1≤n≤1061\le n\le 10^6,且所有测试用例的 nn 之和不超过 10610^6。

子任务编号 分值 特殊限制
1 20 每组 n≤20n\le 20
2 40 ss 中没有 1
3 无特殊限制