luogu#B4101. [CSP-X2023 山东] 回文字符串

[CSP-X2023 山东] 回文字符串

题目描述

作为一个新手,小明刚学了回文字符串,知道了一个字符串如果关于中心对称,则该字符串为回文字符串。

于是他自己就发明了属于他自己的回文字符串,即符合以下条件的字符串 SS 是回文字符串:

首先把字符串 SS 分割成 nn 个子串 S1,S2,,SnS_1,S_2,\ldots,S_n,即 S1+S2++Sn=SS_1+S_2+\ldots+S_n = S(其中 ++ 为字符串拼接操作)。

分割成的子串数量需要大于 11,且不能为空,即 n>1n > 1SiS_i 为非空子串。

对于所有的 i[1,n]i \in[1, n] 有:要么 SiS_iSni+1S_{n−i+1} 相等,要么 SiS_iSni+1S_{n−i+1} 互为回文。(补充说明:字符串 AABB 互为回文指 AA 倒过来与 BB 相等,反之亦然。举例说明:abc\texttt{abc}cba\texttt{cba} 互为回文。)

给定一个字符串 SS,请你帮助小明确定该字符串是否是在上述规则下的回文字符串。

如果是,他还想将字符串 SS 分成尽可能多的子串。

输入格式

一行一个字符串 SS

输出格式

如果不能满足要求,输出一行一个字符串 NO\texttt{NO};否则,输出两行,第一行一个字符串 YES\texttt{YES},第二行一个整数 nn 表示最大的子串数量。

abcababcba
YES 
8
goodluckhavefun
NO
wahacodewaha
YES
3

提示

样例解释

  • 样例 11 解释:最多可以把字符串分成 (a)(b)(c)(ab)(a)\texttt{(a)(b)(c)(ab)(a)} 共 8 个子串。
  • 样例 22 解释:很显然不存在满足题意的分割方案。
  • 样例 33 解释:最多可以把字符串分成 (waha)(code)(waha)\texttt{(waha)(code)(waha)} 共 3 个子串。

数据范围

对于 30%30\% 的数据,1S101\le |S|\le 10;(其中 SS 为给定字符串的长度)

对于 60%60\% 的数据,1S1031\le |S |\le 10^3

其中有 30%30\% 的数据,输入的字符串为回文字符串;

对于 100%100\% 的数据,1S1041\le| S |\le10^4,保证输入的字符串全为小写字母。