A72019. 好串串(string)
编程题
入门
知识点
题目描述
快要小学毕业的小可可决定给好朋友小果果送毕业礼物。
现在小可可有一个长度为 n 的小写字符串 S。
规定“好串串”是指前一半字典序单调不降,后一半字典序单调不升的回文串。
形式化地,长度为 m 的“好串” S 满足:
- S_1 \le S_2 \le ... \le S_{⌈m/2⌉},S_{⌈m/2⌉} \ge S_{⌈m/2⌉+1} \ge ... \ge S_m;
- 对于所有 i = 1, 2, ..., m,满足 S_i = S_{m-i+1};
- 注:字典序是指小写字母表中的顺序(a 最小 z 最大);⌈m/2⌉ 表示 m/2 上取整。
如 z,bbb,accgcca,ccdeeedcc,ghg 等是“好串”,acbca,syzzh,ccb 等不是“好串”。
现在小可可要把 S 分割成若干个不相交的“好串”送给小果果。
因为小果果不想让书包里堆满“好串”,所以小可可要让分割出的“好串”个数尽量少。
可是小可可不会分割,请你来告诉她最少能分割成多少个“好串”吧!
输入格式
本题多组测试。
从文件 string.in 中读取数据。
第一行两个正整数 C, t,表示测试点编号和数据组数,对于样例 1 满足 C = 0。
接下来 t 行,每行一个小写字符串 S,表示小可可的字符串。
输出格式
输出到文件 string.out 中。
输出包含 t 行,每行一个正整数,表示这组数据的答案。
输入输出样例
输入 #1
0 5 czccc ababa edffd bbdddbb aaababa
输出 #1
2 3 2 1 3
说明/提示
【样例 1 解释】
对于第一组测试数据,可以分割为 czc 和 cc。
对于第二组测试数据,可以分割为 a, b, aba 或 aba, b, a。
【样例 2 \sim 7】
见选手目录下的 string/string*.in 与 string/string*.ans。
样例中的 c 代表这组样例对应的实际测试点,其数据范围一致。
| 样例 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|
| C | 2 | 4 | 8 | 13 | 16 | 17 |
【数据范围】
下文中 N 表示单组测试点中所有测试数据 n 的总和。
对于所有测试数据,均有输入的数字均为正整数, t \le 100,n \le 5 × 10^6,N \le 1 × 10^7 且串 S 仅包含小写字母。
测试点信息
| 测试点 | n ≤ | N ≤ | 特殊性质 |
|---|---|---|---|
| 1 | 5 × 10^6 | 1 × 10^7 | A |
| 2, 3 | 10 | 20 | |
| 4 ~ 7 | 200 | 500 | 无 |
| 8 ~ 12 | 5000 | 5 × 10^4 | |
| 13 ~ 15 | B | ||
| 16 | 5 × 10^6 | 1 × 10^7 | C |
| 17 ~ 20 | 无 |
特殊性质说明
- 性质 A:满足 S 全为字符 a
- 性质 B:满足 S 中不存在任意两个相邻字母相同
- 性质 C:满足 S 随机生成,且 t = 2