logo AlgoBeat OnlineJudge
登录 注册

#10083. [Sleeping Cup #8] D. Sorrowful Substrings

内存限制:512 MiB 时间限制:1000 ms 输入文件:sorrow.in 输出文件:sorrow.out
题目类型:传统 评测方式:文本比较
上传者: 匿名

题目描述

注记:

本题中 表示截取字符串 的第 个字符所得到的子串。

一个字符串 被称为「23 串」,当且仅当 不包含除 以外的任何字符。

同一序列 的两个子序列 本质不同,当且仅当集合 不相等。请注意,这并不意味着序列 一定不相等。

本题中 的值超过了 64 位有符号整数(以及 64 位无符号整数)的存储范围,建议使用 C++14(或更高版本)中引入的 __int128 扩展数据类型进行存储。请注意,不要使用 __int128 类型的变量(或常量)作为参数调用 cmathmath.h)库中的函数(如绝对值函数 abs,算术平方根函数 sqrt 等),否则可能会导致编译错误。

你可以使用以下代码(使用时需要包含 <cstdio><bits/stdc++.h> 头文件),并用 read() 读入一个 __int128 类型的正整数,用 readline() 读入一行一个 23 串(该函数返回一个 std::string 类型的字符串,使用时需要包含 <string><bits/stdc++.h> 头文件),用 writeline(x) 输出一行一个 __int128 类型的非负整数 。请注意,不要将以下代码和其他输入输出方式混用:

inline __int128 read()
{
	__int128 x = 0;
	char c = getchar_unlocked();
	while (c < '0') c = getchar_unlocked();
	while (c >= '0')
	{
		x = x * 10 + c - '0';
		c = getchar_unlocked();
	}
	return x;
}
inline std::string readline()
{
	std::string x = "";
	char c = getchar_unlocked();
	while (c < '0') c = getchar_unlocked();
	while (c >= '0')
	{
		x += c;
		c = getchar_unlocked();
	}
	return x;
}
void write(__int128 x)
{
	if (x <= 9)
	{
		putchar_unlocked(x + '0');
		return;
	}
	write(x / 10);
	putchar_unlocked(x % 10 + '0');
}
inline void writeline(__int128 x)
{
	write(x);
	putchar_unlocked('\n');
}

对于一个长度为 的非空 23 串 ,定义其权值 为:

中本质不同的子序列 的个数。

定义一个非空 23 串 是「不开心的」,当且仅当

现给定一个长度为 的 23 串 ,求 中「不开心的」非空子串的数量。

输入格式

第一行两个正整数

第二行一个长度为 的 23 串

输出格式

一行一个非负整数表示答案。

样例

样例输入

20 16
32323232323232323232

样例输出

41

数据范围与提示

样例解释

「不开心的」非空子串有:

  • (共有 个)
  • (共有 个)
  • (共有 个)
  • (共有 个)
  • (共有 个)
  • (共有 个)
  • (共有 个)
  • (共有 个)
  • (共有 个)

故答案为: