CF1738H Palindrome Addicts

题目描述

你的任务是维护一个只包含小写英文字母的队列,具体操作如下: - “push $c$”:在队列的末尾插入一个字母 $c$; - “pop”:从队列的开头删除一个字母。 初始时,队列为空。 每次操作后,你需要统计由队列从头到尾拼接得到的字符串中,不同回文子串的数量。 特别地,空字符串的不同回文子串数量为 $0$。 一个长度为 $n$ 的字符串 $s[1..n]$ 是回文的,当且仅当对于每个 $1 \leq i \leq n$,都有 $s[i] = s[n-i+1]$。 字符串 $s[l..r]$ 是字符串 $s[1..n]$ 的一个子串,当且仅当 $1 \leq l \leq r \leq n$。 两个字符串 $s[1..n]$ 和 $t[1..m]$ 是不同的,当且仅当满足以下条件之一: - $n \neq m$; - 存在某个 $1 \leq i \leq \min\{n,m\}$,使得 $s[i] \neq t[i]$。

输入格式

第一行是一个整数 $q$($1 \leq q \leq 10^6$),表示操作的数量。 接下来的 $q$ 行,每行包含一个如下操作之一: - “push $c$”:在队列末尾插入一个小写英文字母 $c$; - “pop”:从队列开头删除一个字母。 保证在队列为空时不会进行“pop”操作。

输出格式

每次操作后,输出当前队列表示的字符串中,不同回文子串的数量。

说明/提示

设 $s_k$ 表示第 $k$ 次操作后队列中的字符串,$c_k$ 表示 $s_k$ 的不同回文子串数量。下表展示了样例的详细信息。 | $k$ | $s_k$ | $c_k$ | |-----|------------|-------| | 1 | a | 1 | | 2 | 空 | 0 | | 3 | a | 1 | | 4 | aa | 2 | | 5 | aab | 3 | | 6 | aabb | 4 | | 7 | aabba | 5 | | 8 | aabbaa | 6 | | 9 | abbaa | 5 | | 10 | bbaa | 4 | | 11 | baa | 3 | | 12 | baab | 4 | 需要注意的是: - 第 $2$ 次操作后,字符串为空,因此没有子串,答案为 $0$; - 第 $8$ 次操作后,字符串为 “aabbaa”。其 $6$ 个不同的回文子串为 “a”, “aa”, “aabbaa”, “abba”, “b”, “bb”。 由 ChatGPT 4.1 翻译