CF1748B Diverse Substrings

题目描述

一个非空数字字符串被称为“多样的”,如果其中每个字符出现的次数都不超过该字符串中不同字符的个数。 例如: - 字符串 "7" 是多样的,因为 $7$ 出现了 $1$ 次,而不同字符的个数也是 $1$。 - 字符串 "77" 不是多样的,因为 $7$ 出现了 $2$ 次,而不同字符的个数只有 $1$。 - 字符串 "1010" 是多样的,因为 $0$ 和 $1$ 都出现了 $2$ 次,而不同字符的个数是 $2$。 - 字符串 "6668" 不是多样的,因为 $6$ 出现了 $3$ 次,而不同字符的个数是 $2$。 给定一个长度为 $n$ 的字符串 $s$,该字符串只包含数字 $0$ 到 $9$。请你计算它的 $ \frac{n(n+1)}{2} $ 个子串中有多少个是多样的。 如果字符串 $a$ 可以通过从字符串 $b$ 的开头和结尾各删除若干(可能为零或全部)字符得到,则称 $a$ 是 $b$ 的一个子串。 注意,如果同一个多样的字符串在 $s$ 中出现多次,每次出现都要单独计数。例如,在字符串 "77" 中有两个多样的子串 "7",所以该字符串的答案是 $2$。

输入格式

每组测试数据包含多个测试用例。第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。 每个测试用例的第一行包含一个整数 $n$($1 \le n \le 10^5$),表示字符串 $s$ 的长度。 每个测试用例的第二行包含一个长度为 $n$ 的字符串 $s$。保证 $s$ 的所有字符都是 $0$ 到 $9$ 的数字。 保证所有测试用例中 $n$ 的总和不超过 $10^5$。

输出格式

对于每个测试用例,输出一个整数,表示给定字符串 $s$ 的多样子串的数量。

说明/提示

在第一个测试用例中,多样子串为 "7"。 在第二个测试用例中,唯一的多样子串是 "7",它出现了两次,所以答案是 $2$。 在第三个测试用例中,多样子串有 "0"(出现 $2$ 次)、"01"、"010"、"1"(出现 $2$ 次)、"10"(出现 $2$ 次)、"101" 和 "1010"。 在第四个测试用例中,多样子串有 "0"(出现 $3$ 次)、"01"、"011"、"0110"、"1"(出现 $2$ 次)、"10"、"100"、"110" 和 "1100"。 在第五个测试用例中,多样子串有 "3"、"39"、"399"、"6"、"9"(出现 $4$ 次)、"96" 和 "996"。 在第六个测试用例中,字符串 "23456" 的所有 $15$ 个非空子串都是多样的。 由 ChatGPT 4.1 翻译